gpt4 book ai didi

java - swing 中布局的动态变化

转载 作者:太空宇宙 更新时间:2023-11-04 10:47:31 26 4
gpt4 key购买 nike

我几乎可以肯定这个问题之前在这里被问过: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();
}
}
}

每当按下角落里的按钮时,此代码都应该用新布局替换预先存在的布局,但它只是将新布局添加到框架中。有人可以告诉我我做错了什么吗?

编辑:

添加一些信息。引用图片:

picture

我正在滚动 Pane 内制作一组这样的组件。每当我按下“创建新字段”按钮时,我希望它向该滚动 Pane 中的集合添加一个“字段”(字段名称后跟文本区域或类似内容)。这意味着更改滚动 Pane 内区域的布局以包含新字段。

最佳答案

好的——看来您想要做的(如果我错了,请纠正我)是将一个新组件添加到 JScrollPane 中显示的 JPanel 中。如果是这样,那么您不想更改或交换布局,并且您当然不想继续添加新的 JScrollPanes。相反,考虑这样做:

  • 创建一个 JScrollPane 并添加到您的 GUI。不要重新添加此项,因为您只需要一个。
  • 将 JPanel 添加到 JScrollPane 的视口(viewport),该视口(viewport)使用允许轻松添加多个组件的布局。也许是 GridLayout 或 BoxLayout,具体取决于您的需要。
  • 还可以考虑不要将上述 JPanel 直接添加到视口(viewport),而是将其添加到另一个使用 BorderLayout 的 JPanel,将第一个 JPanel 添加到 BorderLayout - 使用 JPanel 的 BorderLayout.PAGE_START 位置,然后将这个添加到 JScrollPane 的视口(viewport)。这样第一个 JPanel 最初不会拉伸(stretch)以填充视口(viewport)。
  • 然后在按钮的 ActionListener 中,通过调用 .add(...) 将组件添加到第一个 JPanel,然后在第一个 JPanel 上调用 revalidate()repaint() 以布局新添加的组件并重新绘制 JPanel 及其内容。

关于java - swing 中布局的动态变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48233310/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com