Hinzufügen JPanel aus einer anderen Klasse JPanel in JFrame
Ich kann nicht mein JFrame aus der main-Klasse zum anzeigen von JPanel aus einer anderen Klasse. Alles ohne Fehler kompiliert.
JFrameTest.java:
package jframetest;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class JFrameTest extends JFrame {
public JFrameTest() {
FlowLayout mainLayout = new FlowLayout();
setSize(320, 480);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(mainLayout);
JPanel panelMain = new JPanel(mainLayout);
JButton testButton = new JButton("Test12");
panelMain.add(testButton);
JPanelOne panel = new JPanelOne();
panelMain.add(panel);
panel.setVisible(true);
add(panelMain);
}
public static void main(String[] arguments) {
JFrameTest frame = new JFrameTest();
frame.setVisible(true);
}
}
JPanelOne.java:
package jframetest;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
public class JPanelOne extends JPanel {
public JPanelOne() {
FlowLayout layoutPanel = new FlowLayout();
JPanel panel = new JPanel(layoutPanel);
JButton button = new JButton("test");
panel.add(button);
panel.setVisible(true);
}
}
Ist es gute Praxis zu halten, verschiedene JPanels, die in Ihren eigenen Klassen? (Beispiel: Wollen JFrame enthalten einige gleiche Größe JPanels, die werden geschaltet durch Einstellung setVisible-Methode() true/false)
BEARBEITEN
Danke für alle Eure Antworten. Notiert. Nun zurück zu meiner Frage:
Nun, dass ich weiß, wie ich hinzufügen einzelner GUI-Elemente erstellt, die in anderen Klassen will ich wissen ob es möglich ist, organisieren von Elementen mit layout-manager in einer der Klassen (vielleicht in einem anderen container als JPanel), so kann ich Sie als eine Gruppe organisiert, die in ein layout (das ist, warum ich gefragt wurde über das erstellen von ganzen JPanel in einer anderen Klasse). Wie auf dem Bild:
JPanel (2. Klasse) - code für dieses Beispiel wäre:
package jframetest;
import java.awt.*;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import net.miginfocom.swing.MigLayout;
public class JPanelOne extends JPanel {
private JPanel panelSettingsMain;
private JLabel labelChooseLanguage, labelWordsCollection;
private JButton buttonSelectLanguage, buttonSelectCollection,
buttonStatistics, buttonPrintingOptions, buttonAddNewWordCollection,
buttonInterfaceCustomization;
private JSeparator separatorSettingsOne, separatorSettingsTwo,
separatorSettingsThree, separatorSettingsFour,
separatorSettingsFive;
private Color greenRegular, separatorGreenLight, separatorGreenDark;
public JPanelOne() {
//creating settings main panel
//setting up layout managers
MigLayout layoutSettingsMain = new MigLayout(
"insets 3 0 0 0");
//setting up colors
greenRegular = new Color(30, 165, 145);
separatorGreenLight = new Color(190, 240, 220);
separatorGreenDark = new Color(130, 205, 180);
panelSettingsMain = new JPanel(layoutSettingsMain);
panelSettingsMain.setBackground(Color.WHITE);
//setting up choose language label
labelChooseLanguage = new JLabel("Choose language:");
panelSettingsMain.add(labelChooseLanguage,
"gapleft 10, gaptop 15, width 200");
//setting up select language button
buttonSelectLanguage = new JButton("language");
buttonSelectLanguage.setForeground(greenRegular);
buttonSelectLanguage.setFocusPainted(false);
buttonSelectLanguage.setBorder(null);
buttonSelectLanguage.setContentAreaFilled(false);
buttonSelectLanguage.setCursor(new java.awt.Cursor(
java.awt.Cursor.HAND_CURSOR));
panelSettingsMain.add(buttonSelectLanguage, "gapbottom 15px, wrap");
//setting up light separator
separatorSettingsOne = new JSeparator();
separatorSettingsOne.setForeground(separatorGreenLight);
panelSettingsMain.add(separatorSettingsOne,
"span 2, width 320, gapbottom 15, wrap");
//setting up words collection label
labelWordsCollection = new JLabel("Words collection:");
panelSettingsMain.add(labelWordsCollection, "gapleft 10");
//setting up selectcollection button
buttonSelectCollection = new JButton("collection");
buttonSelectCollection.setForeground(greenRegular);
buttonSelectCollection.setFocusPainted(false);
buttonSelectCollection.setBorder(null);
buttonSelectCollection.setContentAreaFilled(false);
buttonSelectCollection.setCursor(new java.awt.Cursor(
java.awt.Cursor.HAND_CURSOR));
panelSettingsMain.add(buttonSelectCollection,
"gapbottom 15px, wrap");
//setting up dark separator
separatorSettingsTwo = new JSeparator();
separatorSettingsTwo.setForeground(separatorGreenDark);
panelSettingsMain.add(separatorSettingsTwo,
"span 2, width 320, gapbottom 15px, wrap");
//setting up show statistics button
buttonStatistics = new JButton("Show statistics");
buttonStatistics.setForeground(greenRegular);
buttonStatistics.setFocusPainted(false);
buttonStatistics.setBorder(null);
buttonStatistics.setContentAreaFilled(false);
buttonStatistics.setCursor(new java.awt.Cursor(
java.awt.Cursor.HAND_CURSOR));
panelSettingsMain.add(buttonStatistics,
"gapleft 10, gapbottom 15px, , wrap");
//setting up dark separator
separatorSettingsThree = new JSeparator();
separatorSettingsThree.setForeground(separatorGreenDark);
panelSettingsMain.add(separatorSettingsThree,
"span 2, width 320, gapbottom 15px, wrap");
//setting up printing options button
buttonPrintingOptions = new JButton("Printing options");
buttonPrintingOptions.setForeground(greenRegular);
buttonPrintingOptions.setFocusPainted(false);
buttonPrintingOptions.setBorder(null);
buttonPrintingOptions.setContentAreaFilled(false);
buttonPrintingOptions.setCursor(new java.awt.Cursor(
java.awt.Cursor.HAND_CURSOR));
panelSettingsMain.add(buttonPrintingOptions,
"gapleft 10, gapbottom 15px, wrap");
//setting up dark separator
separatorSettingsFour = new JSeparator();
separatorSettingsFour.setForeground(separatorGreenDark);
panelSettingsMain.add(separatorSettingsFour,
"span 2, width 320, gapbottom 15px, wrap");
//setting up add new word collection button
buttonAddNewWordCollection = new JButton("Add new word collection");
buttonAddNewWordCollection.setForeground(greenRegular);
buttonAddNewWordCollection.setFocusPainted(false);
buttonAddNewWordCollection.setBorder(null);
buttonAddNewWordCollection.setContentAreaFilled(false);
buttonAddNewWordCollection.setCursor(new java.awt.Cursor(
java.awt.Cursor.HAND_CURSOR));
panelSettingsMain.add(buttonAddNewWordCollection,
"gapleft 10, gapbottom 15px, , wrap");
//setting up dark separator
separatorSettingsFive = new JSeparator();
separatorSettingsFive.setForeground(separatorGreenDark);
panelSettingsMain.add(separatorSettingsFive,
"span 2, width 320, gapbottom 10px, wrap");
//setting up interface customization button
buttonInterfaceCustomization = new JButton(
"Interface customization");
buttonInterfaceCustomization.setForeground(greenRegular);
buttonInterfaceCustomization.setFocusPainted(false);
buttonInterfaceCustomization.setBorder(null);
buttonInterfaceCustomization.setContentAreaFilled(false);
buttonInterfaceCustomization.setCursor(new java.awt.Cursor(
java.awt.Cursor.HAND_CURSOR));
panelSettingsMain.add(buttonInterfaceCustomization,
"gapleft 10, gapbottom 15px, wrap");
}
}
Ich dachte über die Navigation durch das Programm GUI-Einstellung JPanels (wie im Beispiel) sichtbar oder nicht sichtbar.
- Ist es guter Weg, es zu tun?
- Sollte ich spaltete meine GUI in einigen Klassen, oder soll ich alles behalten, was in einem ist? Ich Frage, weil jetzt, mit nur der Hälfte der GUI im code seiner über 400 Zeilen lang ist (und es kann nichts als nur "sehen" an dieser Stelle). Da hatte ich gesagt, ich bin Anfänger und es ist eines der längsten Anwendung, die ich bisher geschrieben haben (die ich bin sicher, es ist nicht so lange sowieso!).
BEARBEITEN
Vielleicht bin ich overthinking es, also im Endeffekt ist es ok, um große GUI-Klassen und zur Steuerung der Sichtbarkeit von verschiedenen GUI-Bereiche, indem Sie sichtbar oder nicht?
BEARBEITEN
Ist, habe ich mich in die CardLayout-tutorial bei Oracle und wie es aussieht ist es gut für meine Aufgabe (ohne die JPanels erstellen, die von der externen Klassen, aber es ist ok). Ich missverstanden es zuerst und dachte über das CardLayout nur in Bezug auf tabbed pane (was ich nicht umsetzen wollen, in meinem Projekt).
- In Bezug auf deinen letzten edit, siehe edit zu meiner Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst Ihre Frage zu beantworten, müssen Sie eine Instanz von Ihrem panel auf den Rahmen mit so etwas wie dies in Ihrer JFrameTest Konstruktor:
Müssen Sie auch fügen Sie Ihre Schaltfläche, die direkt zu JPanelOne selbst:
Zweite, ich glaube es ist ein problem mit diesen Zeilen code:
Jeder container sollte eine eigene Instanz einer layout-manager. Sonst wird deine GUI tun seltsame Dinge:
Mit etwas mehr Hilfe (user "Hilek" von einer anderen Seite) ich menaged, um die JPanel aus einer anderen Klasse zu sein displeyed in main-Klasse. Hier ist der code:
JFrameTest.java:
JPanelOne.java:
Print screen von der Arbeit Beispiel:
http://i.stack.imgur.com/qKeBp.jpg
Vielleicht wird jemand es nützlich finden, in das Ihr problem.
Uncompilable source code - Erroneous sym type: javax.swing.JPanel.add
Das problem kommt von der
JPanelOne
Klasse. Es erbtJPanel
aber im Konstruktor erstellen Sie eine neueJPanel
und dann fügen Sie eine Schaltfläche, um es. Wenn Sie dies tun, statt:sollte es so funktionieren, wie Sie es erwarten.
Nicht nennen
setSize()
auf dein JFrame. Stattdessen lassen Sie die layouts legen Sie die richtige Größen der Komponenten und die Benutzeroberfläche. Nachdem Sie alle Komponenten Hinzugefügt haben, um Ihre GUI, rufen Siepack()
auf den JFrame, dann rufen SiesetVisble(true)
. Beachten Sie, dass die meisten layouts hinsichtlich einer Komponente preferredSize so mehr, als seine Größe.Auch, Ihre Berufung
setVisible(true)
auf Ihre einzelnen Komponenten ist unnötig (es sei denn, Sie ändern Ihre Sichtbarkeit nach dem die GUI läuft, aus irgendeinem Grund). Sie wollen auch zu Lesen, Informationen über die Verwendung von layout-Managern, und wird wahrscheinlich FlowLayout weniger, wenn Sie haben Sie studiert.Bearbeiten
In Bezug auf deinen letzten Edit:
Werde ich Antworten, dass dies manchmal hilfreich, zum Beispiel, wenn Sie ändern möchten, ein standard-Rechner in einen wissenschaftlichen Rechner, manchmal ist es gut, um einfach nur zeigen ein bereits erstelltes JPanel gefüllt mit der Voraus Berechnung der Schaltflächen, indem Sie mit setVisible-Methode(true). Wenn auf der anderen hand, die Sie vertauschen möchten "Ansichten" Ihrer GUI zu reflektieren, eine wesentliche änderung in seinem Zustand, zum Beispiel einer Textverarbeitung ändern von edit-Modus zu drucken-Modus, könnte man tauschen JPanels leicht, dies zu tun mit einem CardLayout.