以下类创建一个带有JPanel
容器的窗口。此容器包含JPanel
填充JTextFields
,JPanel
填充JButton
。看起来像这样:
当我点击按钮时,我希望它向左侧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;
}
}
答案 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