如何刷新第二种形式

时间:2012-03-13 20:32:01

标签: java swing netbeans netbeans-7

我有两种形式。首先是使用jslider决定按钮号。第二种形式是根据jslider值显示jbuttons。当我单击jbutton2时,第二个窗体显示并显示按钮。它工作得很好。但是,我想创建jbutton而不在第一种形式中单击jbutton2。 相反,当我更改jslider时,它应该在运行时在第二个窗体上创建按钮,一旦我更改了jslider,它应该在第二个窗体上再次创建该按钮量,并根据jslider值刷新第二个窗体按钮编号。 我试过revalidate();, repaint();但他们不工作,他们不刷新第二种形式。 那么,当第一个表单上的jslider发生变化时,如何刷新第二个表单?

1 个答案:

答案 0 :(得分:1)

实际上你应该提供一段代码,以便我们更好地理解它。 但一般来说,我认为我能理解你的意思(如果我没有错)。

基本上你需要第二个表单上的布局管理器。 这是一个代码示例,我希望它通常可以满足您的需求。

第一张表格的代码

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class FirstForm extends JFrame {
    JButton fbtn  = new JButton("Show F2");
    JSlider fslider = new JSlider(1, 10);
    SecondForm fsecond = new SecondForm();
    public FirstForm(){
        setSize(200,200);
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(fbtn,BorderLayout.NORTH);
        getContentPane().add(fslider,BorderLayout.CENTER);
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        fbtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                fsecond.setVisible(true);
            }
        });
        fslider.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                fsecond.setBtnCount(fslider.getValue());
            }
        });
    }
    public static void main(String[] args) {
        // TODO code application logic here
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
        public void run() {
                new FirstForm().setVisible(true);
            }
        });
    }
}

第二种形式的代码

import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;

public class SecondForm extends JFrame {
    Vector fbtns = new Vector();
    int fshowbtncount=1;
    GridBagConstraints gbc = new GridBagConstraints();
    public SecondForm(){
        setSize(200, 200);
        setLocation(201, 0);
        getContentPane().setLayout(new GridBagLayout());
        fbtns.add(new JButton("Button ".concat(String.valueOf(fbtns.size()+1))));
        invalidateForm();
    }
    private void invalidateForm(){
       gbc.fill = GridBagConstraints.VERTICAL;
       for (int i=0; i<fbtns.size(); i++) {
           getContentPane().remove((Component)fbtns.get(i));
       }
       int y=0;
       for (int i=0; i<fshowbtncount; i++) {
           gbc.gridx=0;
           gbc.gridy=y++;
           getContentPane().add((Component)fbtns.get(i),gbc);
       }
       pack();
       invalidate();
    }
    public void setBtnCount(int cnt){
      if (cnt>=0 && cnt!=fshowbtncount) {
          fshowbtncount = cnt;
          while (fbtns.size()<cnt) {
            fbtns.add(new JButton("Button ".concat(String.valueOf(fbtns.size()+1))));    
          }
          invalidateForm();
      }  
    }
}

希望这可以帮助你。