2012-03-13 57 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(); 
     } 
    } 
} 

希望這可以幫助你。