1

下面的类创建一个带有JPanel容器的窗口。这个容器包含一个JPanel填充的JTextFields,和一个上面JPanel有 aJButton的。看起来像这样: 我的窗户图片

当我单击按钮时,我希望它JTextField在左侧添加另一个按钮JPanel,我想知道该怎么做。我是不是该:

  • JPanel以某种方式改变现有的左派?

  • 使用更大的 GridLayout创建一个新JPanel的,在其中添加我想要的东西(当前项目 + 一个额外的JTextField),然后将其添加JPanel到我的窗口中,以某种方式替换我的当前JPanel

  • 做点别的吗?

以下是我的完整代码。如果您愿意,可以复制、粘贴并运行它。任何帮助表示赞赏!


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;    
public class PanelUpdateTest {
    public static void main(String[] args){
        int row = 4;
        int col = 6;

        JFrame frame = new JFrame();                //the Window
        JPanel container = new JPanel();            //A panel that contains all components

        JPanel buttonPanel = new JPanel();          
        JButton button = new JButton("Add Text Field");     
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){             
                System.out.println("Button \"Add Text Field\" was clicked.");
                //here i want code to add another JTextField to the window.
            }
        });     
        buttonPanel.add(button);

        container.add(createPanel(row, col));
        container.add(buttonPanel);

        frame.add(container);       

        frame.pack();
        frame.setVisible(true);     
    }

    /**
     * This method returns a JPanel filled with JTextFields.
     */
    public static JPanel createPanel(int row, int col){
        JPanel jp = new JPanel();
        jp.setLayout(new GridLayout(row, col));
        for(int i = 0; i < row*col; i++){
            jp.add(new JTextField("  Text  "));
        }       
        return jp;
    }
}
4

3 回答 3

1

•使用更大的GridLayout 创建一个新的JPanel

您不需要更大的 GridLayout。当您向面板添加/删除组件时,布局会动态变化。

我希望它有 4 行和 6 个 JTextField,第 5 行有 1 个 JTextField。

您可以像这样创建 GridLayout:

JPanel = new JPanel( new GridLayout(0, 6) );

然后将 25 个文本字段添加到面板。在为给定行添加第 6 个组件后,布局将自动换行。

于 2013-06-24T19:27:09.717 回答
1

好的,为了解决这个问题,我有几个建议给你。首先也是最重要的是您实际显示面板的方式。如果我继续在后续行上连续添加面板,那么它们在不调整大小的情况下不会在框架中全部可见。

出于这个原因,我建议使用JScrollPane来容纳您返回的面板createPanel您可以在此处阅读文档。

接下来是您使用 this 的问题GridLayout。虽然为文本字段定义所需的行数很好,但您无需在GridLayout. 如果您在布局中将任一参数定义为 0,则它会连续填充该方向。所以,我会new GridLayout(row, col)new GridLayout(0,col). 这样,您的列被填满,但您可以有无限的行。

现在,为了修改JPanel和添加更多文本字段,您需要提供访问权限。出于这个原因,我建议将JPanel jp其制成一个静态变量并在方法内简单地实例化它。

为什么要让它成为静态的?因为您正在处理所有静态方法并且需要提供对ActionListener. 如果您在JFrame实现接口的派生类中执行所有这些操作,则可以使用实例变量来执行此操作。

您的代码将如下所示:

public static JPanel jp = null;
public static JPanel createPanel(int row, int column)
{
    jp = new JPanel();
    //etc etc
}

最后实际上是添加你的JTextFields. 要在您的内部执行此操作ActionListener,首先检查以确保它jp不为空。然后,只需添加您的文本字段,然后调用jp.revalidate();. 这会强制显示更新。

希望这对你有意义!很高兴回答有关代码的任何其他问题或我这样做的任何理由!

于 2013-06-24T15:54:59.233 回答
0

我认为您应该查看 java.awt.Component 中的paint()/repaint()/update() 方法。 甲骨文文档

于 2013-06-24T15:28:28.727 回答