【发布时间】:2018-01-12 20:07:22
【问题描述】:
我几乎可以肯定这个问题之前在这里被问过: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 等)。这意味着更改滚动窗格内区域的布局以包含新字段。
【问题讨论】:
-
如果你想让你的按钮做的只是改变布局,那么你的 ActionListener 应该按照垃圾神在他的回答中建议的去做:改变容器的布局,然后告诉布局管理器重新布局它的组件.他建议您在容器上调用
validate(),但最近已更改为revalidate(),仅此而已。你为什么不这样做?为什么你的 ActionListener 做其他事情? -
如果您需要更改显示的组件,请使用 CardLayout。如果你想改变按钮,那么要么改变它的文本,要么改变它的ActionListener,或者最重要的是改变它的Action。请确切地说明您希望发生什么。
-
@Hovercraft 我真正想做的是在框架上创建一个组件列表。当按下按钮时,我希望能够在框架中添加或删除不确定数量的组件。我很确定这需要替换或更改布局,但我尝试过的每一种方式都只会创建一个奇怪的重复布局。
-
请更具体地列举“创建组件列表”的含义,因为细节很重要。考虑使用此信息编辑您的问题。