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