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?的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮时将单元格动态添加到 UItableview

PrimeNG - 如何在 p-tabView 组件中动态添加和删除 p-tabPanel

如何在单击按钮时将干净的 HTML 复制到剪贴板?

如何添加文件选择器以摆动 GUI 表单调​​色板组件 IntelliJ IDEA

如何在反应js中发生事件(按钮单击)时将组件替换为另一个组件

单击时将图像添加到屏幕并允许其可拖动/可旋转