动态改变布局

时间:2018-01-12 20:07:23

标签: java swing layout

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

我在滚动窗格中制作了一组这样的组件。每当我按下"制作新字段"按钮,我希望它添加一个"字段" (该字段的名称后跟一个textarea或某些此类)到该滚动窗格中的集合。这意味着更改滚动窗格内区域的布局以包含新字段。

2 个答案:

答案 0 :(得分:0)

好的 - 所以看起来你想做什么(如果我错了请纠正我)是将新组件添加到JScrollPane中显示的JPanel。如果是这样,那么您不希望更改或交换布局,并且您当然不希望继续添加新的JScrollPanes。而是考虑做:

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

答案 1 :(得分:0)

好的,事实证明这根本不是布局问题。我没有意识到设置新布局不会导致先前布局的组件消失,您必须在添加新组件之前将其删除。这就是我得到重复的原因。

感谢你指出我正确的方向。