2013-06-24 79 views
0

以下类创建一个带有JPanel容器的窗口。该容器包含填充了JTextFieldsJPanel,以及其上包含JButtonJPanel。看起来是这样的: Picture of my window单击按钮时将组件添加到窗口

当我按一下按钮我希望它添加另一个JTextField向左JPanel,我不知道我应该怎么做。我应该:

  • 以某种方式更改现有的左侧JPanel

  • 创建一个新的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; 
    } 
} 
+0

这一切取决于您执行此操作后希望看起来如何。你想要的效果是什么?添加一行并压扁一切? – brandonsbarber

+0

我希望它有4行6 JTextField和第5行1 JTextField。 – Goatcat

回答

1

好吧,我有几个建议给你,以解决这个问题。首要的是你的手段实际显示你的小组。如果我继续在后续行中添加面板,则它们不会在没有调整大小的情况下全部显示在框架中。

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

接下来是您使用这个GridLayout的问题。虽然定义文本字段所需的行数很好,但不需要在GridLayout中指定。如果您在布局中将任一参数定义为0,则会连续填充该方向。所以,我会用new GridLayout(0,col)替换new GridLayout(row, 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();。这会强制显示更新。

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

+0

感谢您花时间!这真的有帮助! – Goatcat

0

我觉得你应该看看漆java.awt.Component中()/重绘()/更新()方法。 Oracle docs

+1

你不应该使用paint()或update()。将组件添加到可见的GUI时,您将在JPanel上执行revalidate()和repaint()。 – camickr

1

•具有较大的网格布局

创建一个新JPanel你并不需要一个更大的网格布局。在向面板添加/删除组件时,布局动态变化。

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

您创建的网格布局,如:

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

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

+0

谢谢您的输入!这工作=) – Goatcat

相关问题