java - 如何在单击时将摆动组件动态添加到 gui?
Posted
技术标签:
【中文标题】java - 如何在单击时将摆动组件动态添加到 gui?【英文标题】:java - How would I dynamically add swing component to gui on click? 【发布时间】:2011-05-15 19:58:46 【问题描述】:我想做的是与向电子邮件添加附件类似的原理,您可以单击一个按钮,然后会打开一个新的浏览框,从而增加您可以拥有的单独附件的数量。
我还很新,如果有人能指点我一个例子吗?
【问题讨论】:
你可以像静态地那样做,但根据你想要做什么,它们可能是更好的解决方案。 【参考方案1】:Java : 动态添加 swing 组件
for Example : count=3
//Java Swing: Add Component above method
public void dya_addcomp(int count)
//Dynamicaly Delete Image_icon
BufferedImage Drop_Tablefield = null;
try
Drop_Tablefield = ImageIO.read(this.getClass().getResource("/images/drop.png"));
catch (IOException ex)
msg(" Error: drop and edit icon on Table, "+ex);
//count Items: 3 times for loop executed..
for(int i=0;i<count;i++)
//cnt++;
//lblcount.setText("Count : "+cnt);
JTextField txtcolnm=new JTextField("",20);
JComboBox cmbtype=new JComboBox();
JTextField txtcolsize=new JTextField("",20);
JButton Drop_Table_Field = new JButton(new ImageIcon(Drop_Tablefield));
cmbtype.addItem("INTEGER"); cmbtype.addItem("FLOAT");
cmbtype.addItem("STRING"); cmbtype.addItem("BOOLEAN");
colnamepanel.add(txtcolnm); colnamepanel.add(cmbtype);
colnamepanel.add(txtcolsize); colnamepanel.add(Drop_Table_Field);
colnamepanel.setAutoscrolls(true);
//refresh panel
colnamepanel.revalidate();
colnamepanel.repaint();
//set the layout on Jpanel
colnamepanel.setLayout(new FlowLayout(FlowLayout.LEFT,5,0));
//end for loop
//end method
【讨论】:
【参考方案2】:动态添加按钮的示例代码。
panel.add(new JButton("Button"));
validate();
完整代码:
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.FlowLayout;
import java.awt.BorderLayout;
public class AddComponentOnJFrameAtRuntime extends JFrame implements ActionListener
JPanel panel;
public AddComponentOnJFrameAtRuntime()
super("Add component on JFrame at runtime");
setLayout(new BorderLayout());
this.panel = new JPanel();
this.panel.setLayout(new FlowLayout());
add(panel, BorderLayout.CENTER);
JButton button = new JButton("CLICK HERE");
add(button, BorderLayout.SOUTH);
button.addActionListener(this);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 500);
setVisible(true);
public void actionPerformed(ActionEvent evt)
this.panel.add(new JButton("Button"));
this.panel.revalidate();
validate();
public static void main(String[] args)
AddComponentOnJFrameAtRuntime acojfar = new AddComponentOnJFrameAtRuntime();
Resource
【讨论】:
据我所知,revalidate()
和/或validate()
后面应该跟repaint()
(否则更改不会被反映)同样使用validate()
是多余的,因为revalidate()
调用@ 987654329@
在validate()
或revalidate()
之后调用repaint()
并不总是必要的。虽然我不知道何时需要它的条件...我的应用程序中有一个案例,没有validate()
、revalidate()
和repaint()
,添加组件时窗口不会重绘。只需添加validate()
即可显示新组件。
@jmj - 感谢您的解决方案。实际上,当我们在 actionPerformed
方法中没有其他任务要执行时,它的工作原理。但如果我有其他任务要执行,首先它执行这些任务,最后时刻Button
正在添加到panel
。我期待相反的情况。首先它应该在Panel
中添加Button
并为actionperformed
方法执行其他任务。【参考方案3】:
panel.add(按钮);
panel.revalidate();
panel.repaint();
【讨论】:
【参考方案4】:在调用 setSize()
之前组件不可见:
component.setSize(100,200);
jPanel.add(component);
jPanel.revalidate();
jPanel.repaint();
【讨论】:
【参考方案5】:public static void main(String[] args)
final JFrame frame = new JFrame("Test");
frame.setLayout(new GridLayout(0, 1));
frame.add(new JButton(new AbstractAction("Click to add")
@Override
public void actionPerformed(ActionEvent e)
SwingUtilities.invokeLater(new Runnable()
@Override
public void run()
frame.add(new JLabel("Bla"));
frame.validate();
frame.repaint();
);
));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setVisible(true);
【讨论】:
以上是关于java - 如何在单击时将摆动组件动态添加到 gui?的主要内容,如果未能解决你的问题,请参考以下文章
PrimeNG - 如何在 p-tabView 组件中动态添加和删除 p-tabPanel
如何添加文件选择器以摆动 GUI 表单调色板组件 IntelliJ IDEA