Ich fand ein Beispiel, in denen Schaltflächen zu Panels hinzugefügt werden (Instanzen von JPanel
) dann Panels zu den Containern hinzugefügt werden (Instanzen generiert von getContentPane()
) und Container sind durch die Konstruktion in die JFrame
(die Fenster) enthalten.Was ist die Beziehung zwischen ContentPane und JPanel?
Ich habe versucht, zwei Dinge:
ich die Behälter losgeworden. Genauer gesagt, habe ich Schaltflächen zu einem Panel hinzugefügt (Instanz
JPanel
) und dann habe ich das Panel zu den Fenstern hinzugefügt (InstanzJFrame
). Es hat gut funktioniert.Ich habe die Panels los. Genauer gesagt habe ich Schaltflächen direkt zum Container hinzugefügt und dann den Container zum Fenster hinzugefügt (Instanz
JFrame
).
So verstehe ich zwei Dinge nicht.
Warum haben wir zwei konkurrierende Mechanismen, um die gleichen Dinge zu tun?
Warum werden Behälter in Kombination mit den Platten verwendet (
JPanel
)? (Zum Beispiel, was wir für Buttons in JPanels haben, und dann fügen wir JPanels in die Container ein). Können wirJPanel
inJPanel
einschließen? Können wir einen Container in einen Container aufnehmen?
ZUSÄTZLICH:
Vielleicht Essenz meiner Frage kann in einer Codezeile gesetzt werden:
frame.getContentPane().add(panel);
Was für wir getContentPane()
setzen dazwischen? Ich habe versucht, nur frame.add(panel);
und es funktioniert gut.
2 Addiert:
Ich mag würde einige Code hinzufügen, um mehr klar, was ich meine. In diesem Beispiel verwende ich nur 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);
}
}
Und in diesem Beispiel verwende ich nur Inhaltsfenster:
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);
}
}
Beide arbeiten gut! Ich möchte nur wissen, ob zwischen diesen beiden Arten, Dinge zu tun, einer besser (sicherer) ist.
@Nate, was meinst du mit "Intern, es ist ein JPanel". Sie meinen, dass Container ein JPanel verwendet? Was meinst du damit? Ich denke, dass JPanel eine Unterklasse von Container ist. Und was kann ich mit "setContentPane" ändern? OK. Sie sagen, Container ist eine Klasse (und ich habe Container immer als Klasse betrachtet). Aber JPane ist auch eine Klasse. Warum können wir nicht nur JPane oder nur Container verwenden?Ich konnte die gleichen Dinge tun, indem ich nur JPane verwendete. Ich konnte dasselbe auch nur mit Containern tun. – Roman
'JFrame' verwendet intern ein' JPanel' -Objekt, um die 'getContentPane()' -Methode zu unterstützen. Deshalb funktioniert Zacharys Antwort. Die tatsächliche 'JPanel'-Referenz ist im' JFrame.rootPane'-Feld vergraben. Sie würden 'setContentPane()' auf dem 'JFrame' aufrufen - zum Beispiel könnten Sie Zeile 10 in Ihrem ersten Beispiel von' frame.add (panel) 'in' frame.setContentPane (panel) 'ändern. Container ist eine Klasse. 'JPanel' ist eine Klasse (die eine Unterklasse von' Container' ist). Sie verwechseln den Typ der Referenz mit dem Typ des Objekts, auf das die Referenz verweist. Denken Sie an 'Container container = new JPanel()' – Nate
@Nate die Quelle (http://pragmaticjava.blogspot.com.ar/2008/08/program-to-interface-not-implementation.html) wurde entfernt. – Lucio