2012-10-03 6 views
7

Desidero visualizzare 2 oggetti su JFrame. Ho provato aggiungendo oggetti a JPanel e aggiungendo JPanel a JFrame ma non ha funzionato. Ho anche provato ad aggiungere oggetti palla e palla1 direttamente a JFrame ma mostra solo l'ultimo oggetto aggiunto. Voglio mostrare entrambi gli oggetti su JFrame alla volta. Il codice sotto riportato mostra solo oggetto ball1.Aggiunta di 2 o più oggetti a JFrame

JFrame f = new JFrame("Moving"); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    //making 2 objects 
    Ballbewegung2 ball = new Ballbewegung2(); 
    Ballbewegung3 ball1 = new Ballbewegung3(); 
    JPanel contentPane = new JPanel(new BorderLayout()); 
    JPanel contentPane1 = new JPanel(new BorderLayout()); 

    //adding objects to JPanel 
    contentPane.add(ball, BorderLayout.CENTER);     
    contentPane1.add(ball1, BorderLayout.CENTER);     

    //Adding JPanel to JFrmae 
    f.getContentPane().add(contentPane); 
    f.getContentPane().add(contentPane1); 
    f.setSize(500, 500); 
    f.setVisible(true); 

risposta

4

Il riquadro del contenuto di JFrame ha BorderLayout gestore di layout di default. Ciò significa che se aggiungi un componente, verrà inserito nel CENTRO. Se aggiungi un altro componente, esso verrà nuovamente inserito nel CENTRO e sostituirà il componente aggiunto in precedenza.

Un esempio come aggiungere più componenti:

JFrame f = new JFrame(); 

JPanel p = new JPanel(); 

p.add(new JButton("One")); 
p.add(new JButton("Two")); 

f.getContentPane().add(p, BorderLayout.CENTER); 

O quando si aggiunge un componente riquadro del contenuto, specificare dove per dirla (e specificare diverse posizioni):

JFrame f = new JFrame(); 

f.getContentPane().add(new JButton("One"), BorderLayout.NORTH); 
f.getContentPane().add(new JButton("Two"), BorderLayout.CENTER); 
+0

sto dando diverse coordinate degli oggetti dove sono shown.I hanno anche provato il secondo metodo, sovrascrive ancora il primo oggetto. – user1717353

+0

Sbagliato, si chiama 'f.getContentPane()' due volte passando 2 componenti diversi, ma senza specificare i vincoli. E un pannello con BorderLayout senza vincoli specificati esplicitamente aggiungerà il componente alla posizione CENTRO, il secondo sostituendo il primo. – icza

5

Ti suggerisco di utilizzare un JPanel per contenere sia JPanel come figli, e aggiungere un singolo JPanel al riquadro del contenuto JFrame.

La seconda chiamata al metodo JFrame.add() sostituirà il primo JPanel aggiunto, se non si specifica esplicitamente una posizione di layout diversa.

Un semplice esempio usando BoxLayout:

JPanel mainPanel= new JPanel(); 
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

mainPanel.add(contentPane); 
mainPanel.add(contentPane1); 
contentPane.add(mainPanel); 
+0

Il codice funziona bene quando aggiungo più di 1 pulsante su JFrame ma non funziona con gli oggetti delle mie classi. Ho anche provato a utilizzare 3 JPanles e quindi l'aggiunta di mainPanel a JFrame ma ancora lo stesso output. – user1717353

1

Ecco un esempio di raggiungere UI qualcosa di simile

UI

I componenti Java utilizzati sono i seguenti Java Components

Codice :

// Call this function from the main 
private static void createAndShowGUI() { 
    // Create and set up the content pane. 
    MainPanel panel = new MainPanel(); 
    panel.setOpaque(true); // content panes must be opaque 

    // Display the window. 
    JFrame frmConsole = new JFrame("ITSME"); 
    frmConsole.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frmConsole.setPreferredSize(new Dimension(640, 480)); 
    frmConsole.add(panel); 
    frmConsole.pack(); 
    frmConsole.setLocationRelativeTo(null); 
    frmConsole.setVisible(true); 
} 

Classe MainPanel

public class MainPanel extends JPanel implements ActionListener { 
    private static final long serialVersionUID = 1L; 
    private int m_nX, m_nY; 
    private int m_nHeight = 30, m_nWidthLabel = 500, m_nPadding = 2; 

    private JLabel m_lblFilename, m_lblFileGen; 

    public MainPanel() { 
     // TODO Auto-generated constructor stub 
     super(new BorderLayout()); 
     try { 
      this.setLayout(null); 
      this.setBorder(new TitledBorder(new EtchedBorder(), 
       "Dynamic Time Warping")); 

      m_nX = this.getX() + 12; 
      m_nY = this.getY() + 24; 

      // Add the Filename Label 
      m_lblFilename = new JLabel("Label1"); 
      m_lblFilename.setBorder(new LineBorder(Color.BLUE, 2)); 
      m_lblFilename.setBounds(nX, nY, m_nWidthLabel, m_nHeight); 
      this.add(m_lblFilename); 

      // Adding a Label 
      nY += m_lblFilename.getHeight() + m_nPadding; 
      m_lblFileGen = new JLabel("Label1"); 
      m_lblFileGen.setBorder(new LineBorder(Color.RED, 2)); 
      m_lblFileGen.setBounds(nX, nY, m_nWidthLabel, 3 * m_nHeight); 
      m_lblFileGen.setForeground(Color.BLUE); 
      this.add(m_lblFileGen); 
     } catch (Exception e) { 
     e.printStackTrace(); 
    } 
}