2012-03-13 60 views
1

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

+0

http://stackoverflow.com/questions/9695833/java-refreshing-second-form的副本 – 2012-03-14 04:31:47

回答

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(); 
     } 
    } 
} 

希望这可以帮助你。