我几乎可以肯定这个问题在此之前被问过:Java Swing: How to change GUI dynamically,但我似乎对它的运作方式有一些基本的误解。
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class JTest extends JFrame
{
public static void main(String[] args)
{
JTest t = new JTest();
}
Container pane;
public JTest()
{
setSize(500,500);
setTitle("JTest");
setDefaultCloseOperation(EXIT_ON_CLOSE);
pane = getContentPane();
pane.setLayout(new GridLayout(1,2));
JButton old = new JButton("old");
old.addActionListener(new OldButton());
pane.add(old);
JScrollPane scroll = new JScrollPane(new JTextArea(50,20));
pane.add(scroll);
setVisible(true);
}
private class OldButton implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
pane.setLayout(new GridLayout(1,2));
JButton old = new JButton("new");
old.addActionListener(new NewButton());
pane.add(old);
JScrollPane scroll = new JScrollPane(new JTextArea(50,20));
pane.add(scroll);
pane.validate();
}
}
private class NewButton implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
pane.setLayout(new GridLayout(1,2));
JButton old = new JButton("old");
old.addActionListener(new OldButton());
pane.add(old);
JScrollPane scroll = new JScrollPane(new JTextArea(50,20));
pane.add(scroll);
pane.validate();
}
}
}
当按下角落中的按钮时,此代码应该用新的代码替换预先存在的布局,而只是将新布局添加到框架中。有人能告诉我我做错了吗?
编辑:
添加一些信息。参考图片:
我在滚动窗格中制作了一组这样的组件。每当我按下"制作新字段"按钮,我希望它添加一个"字段" (该字段的名称后跟一个textarea或某些此类)到该滚动窗格中的集合。这意味着更改滚动窗格内区域的布局以包含新字段。
答案 0 :(得分:0)
好的 - 所以看起来你想做什么(如果我错了请纠正我)是将新组件添加到JScrollPane中显示的JPanel。如果是这样,那么您不希望更改或交换布局,并且您当然不希望继续添加新的JScrollPanes。而是考虑做:
.add(...)
将组件添加到第一个JPanel,然后在第一个JPanel上调用revalidate()
和repaint()
来布局新添加的组件并重新绘制JPanel及其内容。答案 1 :(得分:0)
好的,事实证明这根本不是布局问题。我没有意识到设置新布局不会导致先前布局的组件消失,您必须在添加新组件之前将其删除。这就是我得到重复的原因。
感谢你指出我正确的方向。