2010-11-25 11 views
22

Quello che sto cercando di fare è un principio simile all'aggiunta di allegati alle e-mail, è possibile fare clic su un pulsante e una nuova casella di ricerca si aprirà aumentando il numero di allegati separati che è possibile avere.java - Come aggiungerei dinamicamente il componente swing a gui al clic?

Sono abbastanza nuovo quindi se qualcuno potrebbe indicarmi un esempio?

+0

È possibile farlo come lo si fa in modo statico, ma possono essere soluzioni più bello a seconda di cosa si vuole fare. – khachik

risposta

31

codice di esempio per aggiungere pulsanti al volo in modo dinamico.

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

codice 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

grazie ...! è molto utile ... hehehe .... – gumuruh

+6

Per quanto ne so, 'revalidate()' e/o 'validate()' dovrebbero essere seguiti da 'repaint()' (o le modifiche non saranno refelcted) usando anche ' validate() 'è ridondante come' revalidate() 'chiama' validate() ' –

+0

thanks..it ha funzionato –

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 non era visibile fino a quando è stato chiamato setSize():

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

pan el.add (pulsante);

panel.revalidate();

panel.repaint();

0

Java: Aggiungere dinamicamente componenti 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