2010-11-25 14 views
22

Lo que estoy buscando hacer es un principio similar a agregar archivos adjuntos a los correos electrónicos, puede hacer clic en un botón y se abrirá un nuevo cuadro de diálogo para aumentar la cantidad de archivos adjuntos que pueda tener.java - ¿Cómo podría agregar dinámicamente el componente swing a la interfaz gráfica de usuario al hacer clic?

Soy bastante nuevo así que si alguien me puede indicar un ejemplo?

+0

Puede hacerlo como lo hace de forma estática, pero pueden ser más agradables soluciones dependiendo de lo que quiere hacer. – khachik

Respuesta

31

Código de ejemplo para agregar botones dinámicamente sobre la marcha.

panel.add(new JButton("Button")); 
validate(); 

código completo:

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(); 
    } 
} 
+0

gracias ...! es muy útil ... jejeje .... – gumuruh

+6

Por lo que yo sé, 'revalidar()' y/o 'validate()' debe ser seguido por 'repinte()' (o cambios no será Refelcted) también usando ' validar() '' es redundante, ya que revalidate() '' llama validate() ' –

+0

thanks..it trabajó –

9
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); 
} 

screenshot

0

Componente no era visible hasta que fue llamado setSize():

component.setSize(100,200); 
jPanel.add(component); 
jPanel.revalidate(); 
jPanel.repaint(); 
0

sartén el.add (botón);

panel.revalidate();

panel.repaint();

0

Java: Agregar dinámicamente los componentes 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 
Cuestiones relacionadas