单击按钮时将组件添加到窗口

时间:2013-06-24 15:21:02

标签: java swing jpanel awt jbutton

以下类创建一个带有JPanel容器的窗口。此容器包含JPanel填充JTextFieldsJPanel填充JButton。看起来像这样: Picture of my window

当我点击按钮时,我希望它向左侧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;
    }
}

3 个答案:

答案 0 :(得分:1)

好的,我有几条建议可以解决这个问题。 首先是您实际显示面板的方法。如果我继续在后续行中连续添加面板,则在没有调整大小的情况下,它们在框架中不会全部可见。

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

接下来是您使用此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();即可。这会强制显示更新。

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

答案 1 :(得分:1)

  

•使用更大的GridLayout

创建一个新的JPanel

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

  

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

您可以创建GridLayout,如:

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

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

答案 2 :(得分:0)

我认为您应该查看java.awt.Component中的paint()/ repaint()/ update()方法。 Oracle docs