Ho trovato un esempio in cui i pulsanti vengono aggiunti ai pannelli (istanze di JPanel
), quindi i pannelli vengono aggiunti ai contenitori (istanze generate da getContentPane()
) e quindi i contenitori sono inclusi nella JFrame
(le finestre).Qual è la relazione tra ContentPane e JPanel?
Ho provato due cose:
mi sono liberato dei contenitori. In ulteriori dettagli, ho aggiunto pulsanti a un pannello (istanza di
JPanel
) e quindi ho aggiunto il pannello a Windows (istanza diJFrame
). Ha funzionato bene.Mi sono liberato dei pannelli. In ulteriori dettagli, ho aggiunto pulsanti direttamente al contenitore e quindi ho aggiunto il contenitore alla finestra (istanza di
JFrame
).
Quindi, non capisco due cose.
Perché abbiamo due meccanismi in competizione per fare le stesse cose?
Qual è la ragione per utilizzare i contenitori in combinazione con i pannelli (
JPanel
)? (Ad esempio, per quanto includiamo i pulsanti in JPanels e quindi includiamo JPanel nei Containers). Possiamo includereJPanel
inJPanel
? Possiamo includere un contenitore nel contenitore?
aggiunto:
Forse essenza della mia domanda può essere messo in una riga di codice:
frame.getContentPane().add(panel);
Ciò che per mettiamo getContentPane()
in mezzo? Ho provato solo frame.add(panel);
e funziona perfettamente.
Aggiunto 2:
vorrei aggiungere del codice ad essere più chiari su quello che voglio dire. In questo esempio, io uso solo JPane:
import java.awt.*;
import javax.swing.*;
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorldSwing");
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(new JButton("W"), BorderLayout.NORTH);
panel.add(new JButton("E"), BorderLayout.SOUTH);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
E in questo esempio io uso solo Content Pane:
import java.awt.*;
import javax.swing.*;
public class HelloWorldSwing {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorldSwing");
Container pane = frame.getContentPane();
pane.setLayout(new BorderLayout());
pane.add(new JButton("W"), BorderLayout.NORTH);
pane.add(new JButton("E"), BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
Entrambi lavorano bene! Voglio solo sapere se tra questi due modi di fare le cose è meglio (più sicuro).
@Nate, cosa intendi con "Internamente, sta usando un JPanel". Vuoi dire che Container usa JPanel? Che cosa vuoi dire con questo? Penso che JPanel sia una sottoclasse di Container. E cosa posso cambiare con "setContentPane"? OK. Tu dici che Container è una classe (e ho sempre considerato Container come una classe). Ma JPane è anche una classe. Perché non possiamo usare solo JPane o semplicemente Container?Sono stato in grado di fare le stesse cose usando solo JPane. Sono stato anche in grado di fare lo stesso usando solo contenitori. – Roman
'JFrame' utilizza internamente un oggetto' JPanel' per eseguire il metodo 'getContentPane()'. Questo è il motivo per cui la risposta di Zachary funziona. Il riferimento effettivo 'JPanel' è sepolto nel campo' JFrame.rootPane'. Chiameresti 'setContentPane()' su 'JFrame' - per esempio, potresti cambiare la riga 10 nel tuo primo esempio da' frame.add (pannello) 'a' frame.setContentPane (pannello) '. 'Container' è una classe. 'JPanel' è una classe (che è una sottoclasse di' Container'). Stai confondendo il tipo di riferimento con il tipo dell'oggetto i riferimenti di riferimento. Pensa a 'Container container = new JPanel()' – Nate
@Nate source (http://pragmaticjava.blogspot.com.ar/2008/08/program-to-interface-not-implementation.html) è stato rimosso. – Lucio