Hallo Community
Ersteinmal: Dies ist mein erste Post hier in diesem Forum, wenn es also irgendwelche Tipps gibt, insbesondere was Übersichtlichkeit bzw. Klarheit des Posts angeht, bitte einfach rundheraus sagen, deswegen bin ich hier, um Fehler gezeigt zu bekommen ( am Besten dann mit Lösungstipps ).
So, dann mal zu meinen Fragen:
Ich hatte vor, mir ein ganz einfaches Programm zu schreiben, mit dem ich zwischen mehreren Menüs hin und her schalten kann. Diese Menüs wären einfache Buttons, welche ich in verschiedenen Panels gelagert habe. Durch klick auf Button A wird zu Menü A gewechselt, von dort kann ich dann zurück oder zu Menü B.
Das erstellen der einzelnen Menüs ist soweit kein Problem, auch das erstellen/ einfügen der Panels/Buttons funktioniert.
Probleme bereitet mir nun der ActionListener. Diesen wollte ich, da er bei entsprechend vielen Menüs sehr umfrangreich werden könnte, nicht als innere Klasse erstellen. Ich habe zwar gelesen, dass es auch über anonyme Klasse gehen soll, aber die kenn ich bisher nur vom Namen, also wollte ich es in eine einfache externe Klasse legen. Diese Klasse habe ich dazu noch in ein anderes Package gelagert.
Aussehen tut das ganze in etwas so:
[Java]
package gui;
public class MainClass {
public static void main(String[] args){
new GUI();
}
}
[/Java]
[Java]
package gui;
import java.awt.Font;
import javax.swing.*;
public class GUI extends JFrame {
Font titleSchrift = new Font("Arial", Font.BOLD, 45);
//Variables
//
boolean quit = false; // als Idee zum Beenden des Programms, s. Probleme unten
JLabel lbTitle;
public JButton btMainMenu;
public JButton btMenuA;
public JButton btMenuB;
public JButton btQuit;
JPanel MainMenuPanel;
JPanel MenuAPanel;
JPanel MenuBPanel;
public GUI(){
super("Menu-Test");
createGUI();
createMainMenuPanel();
}
private void createGUI(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
setLocationRelativeTo(null);
setVisible(true);
setLayout(null); // in Layouts hatte ich mich bisher noch nicht eingearbeitet, später
//würde ich für dieses Problem sowas wie den GridLayoutManager verwenden
}
public void createMainMenuPanel(){
MainMenuPanel = new JPanel();
MainMenuPanel.setLayout(null);
MainMenuPanel.setVisible(true);
MainMenuPanel.setBounds(300, 320, 300, 300);
add(MainMenuPanel);
lbTitle = new JLabel("MenuWechsler");
lbTitle.setFont(titleSchrift);
lbTitle.setBounds(230, 170, 400, 50);
add(lbTitle);
btMenuA = new JButton("Go to Menu A");
btMenuA.setBounds(0, 0, 200, 40);
MainMenuPanel.add(btMenuA);
btMenuB = new JButton("Go to Menu B");
btMenuB.setBounds(0, 60, 200, 40);
MainMenuPanel.add(btMenuB);
btQuit = new JButton("Quit");
btQuit.setBounds(0, 120, 200, 40);
MainMenuPanel.add(btQuit);
}
public void createMenuAPanel(){
OptionsPanel.setLayout(null);
OptionsPanel.setVisible(false);
OptionsPanel.setBounds(100, 75, 300, 300);
add(OptionsPanel);
btMainMenu = new JButton("Back to MainMenu");
btMainMenu.setBounds(0, 40, 50, 20);
OptionsPanel.add(btMainMenu);
}
//################################################## --- Setter --- ##################################################
//
public void setMainMenuPanelVisible(Boolean bool){
MainMenuPanel.setVisible(bool);
}
public void setMenuAPanelVisible(Boolean bool){
MenuA.setVisible(bool);
}
}
[/Java]
[Java]
package listener;
import gui.GUI;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MainMenuListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent ae) {
if(ae.getSource() == GUI.btQuit){
//to do
}
else if(ae.getSource() == GUI.btMenuA){
//GUI.createMenuAPanel();
// vermutlich wäre es hier besser GUI.showMenuAPanel(); zu nutzen, aber das habe ich noch nicht
//implementiert
}
}
}
[/Java]
Das ganze ist natürlich nur eine Grobstruktur. Bei einigen Paneln fehlen noch Buttons, manchel Panel wurden garnicht genutzt. Ich würde gerne erstmal die Probleme die ich jetzt schon habe lösen .
Die Idee dahinter war, dass ich einfach die Sichtbarkeit (also Visible, nicht public oder so) der einzelnen Panel per Knopfdruck ändere um das entsprechende neue Menu zu zeigen.
Meine Fragen wären nun:
1. Ist es überhaupt eine gute Idee, das ganze so auf zu ziehen oder gibts das bessere Ansätze?
2. Beim MainMenuListener wird nun gesagt, dass ich die Buttons static machen muss. Verständlich, schließlich habe ich keine Instamz von GUI erzeugt, in dem der Button liegen soll. Wie kann ich das lösen? Denn ich möchte die Button eigentlich nicht static machen, der Listener soll ja nur was machen, wenn es auch tatsächlich einen Button gibt auf den er achtet.
Und extra in jedem einzelnen Listener neue Instanzen der Buttons zu erstellen kann ja auch nicht gerade Sinn der Übung sein.
3. Wie kann ich einen Quit-Button implementieren? In vorherigen Fällen habe ich meistens das Programm in einer Schleife gehabt und auf einen Bool reagieren lassen. Diese Programme waren allerdings immer ohne GUI, hier würde ich das nun gerne anders regeln.
Wenn ich den Listener in der GUI-Klasse implemeniere, könnte ich zwar
nutzen. Aber 1. ist das überhaupt schön? Und 2. habe ich halt eine externe Klasse und dazu keine Instanz des ganzen (zumindest wenn ich das richtig sehe).
So, ich bin mir sicher, dass mir noch zig weitere Fragen einfallen würden, aber erstmal sollte das genügen. Ich befürchte, das es einige grundlegende Java-Verständnissprobleme gibt, die ich beheben muss, aber gut, daher lerne ich das ganze ja.
Freue mich auf eure Antworten.
Khashayar
PS: Als ich in der Forums FAQ versucht habe mir die einzelnen Punkte anzuschaun ("Wie man Fragen richtig stellt" und "Wie kann ich ein Thema als [Erledigt] markieren?" insbesondere), kam folgende Fehlermeldung:
"Khashayar, Sie haben keine Rechte, um auf diese Seite zuzugreifen. Folgende Gründe könnten z.B. dafür verantwortlich sein:
Sie versuchen, den Beitrag eines anderen Benutzers zu ändern oder auf administrative Funktionen zuzugreifen. Überprüfen Sie bitte in den Forenregeln, ob Sie diese Aktion ausführen dürfen.
Wenn Sie versucht haben, einen Beitrag zu schreiben, kann es sein, dass Ihr Benutzerkonto deaktiviert wurde oder noch aktiviert werden muss."
Das ganze war auch noch da, nachdem ich meine Account durch die zugeschickten Link aktiviert habe. Sonst könnte ich glaube ich auch garnicht posten. Was könnte da das Problem sein?
Ersteinmal: Dies ist mein erste Post hier in diesem Forum, wenn es also irgendwelche Tipps gibt, insbesondere was Übersichtlichkeit bzw. Klarheit des Posts angeht, bitte einfach rundheraus sagen, deswegen bin ich hier, um Fehler gezeigt zu bekommen ( am Besten dann mit Lösungstipps ).
So, dann mal zu meinen Fragen:
Ich hatte vor, mir ein ganz einfaches Programm zu schreiben, mit dem ich zwischen mehreren Menüs hin und her schalten kann. Diese Menüs wären einfache Buttons, welche ich in verschiedenen Panels gelagert habe. Durch klick auf Button A wird zu Menü A gewechselt, von dort kann ich dann zurück oder zu Menü B.
Das erstellen der einzelnen Menüs ist soweit kein Problem, auch das erstellen/ einfügen der Panels/Buttons funktioniert.
Probleme bereitet mir nun der ActionListener. Diesen wollte ich, da er bei entsprechend vielen Menüs sehr umfrangreich werden könnte, nicht als innere Klasse erstellen. Ich habe zwar gelesen, dass es auch über anonyme Klasse gehen soll, aber die kenn ich bisher nur vom Namen, also wollte ich es in eine einfache externe Klasse legen. Diese Klasse habe ich dazu noch in ein anderes Package gelagert.
Aussehen tut das ganze in etwas so:
[Java]
package gui;
public class MainClass {
public static void main(String[] args){
new GUI();
}
}
[/Java]
[Java]
package gui;
import java.awt.Font;
import javax.swing.*;
public class GUI extends JFrame {
Font titleSchrift = new Font("Arial", Font.BOLD, 45);
//Variables
//
boolean quit = false; // als Idee zum Beenden des Programms, s. Probleme unten
JLabel lbTitle;
public JButton btMainMenu;
public JButton btMenuA;
public JButton btMenuB;
public JButton btQuit;
JPanel MainMenuPanel;
JPanel MenuAPanel;
JPanel MenuBPanel;
public GUI(){
super("Menu-Test");
createGUI();
createMainMenuPanel();
}
private void createGUI(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
setLocationRelativeTo(null);
setVisible(true);
setLayout(null); // in Layouts hatte ich mich bisher noch nicht eingearbeitet, später
//würde ich für dieses Problem sowas wie den GridLayoutManager verwenden
}
public void createMainMenuPanel(){
MainMenuPanel = new JPanel();
MainMenuPanel.setLayout(null);
MainMenuPanel.setVisible(true);
MainMenuPanel.setBounds(300, 320, 300, 300);
add(MainMenuPanel);
lbTitle = new JLabel("MenuWechsler");
lbTitle.setFont(titleSchrift);
lbTitle.setBounds(230, 170, 400, 50);
add(lbTitle);
btMenuA = new JButton("Go to Menu A");
btMenuA.setBounds(0, 0, 200, 40);
MainMenuPanel.add(btMenuA);
btMenuB = new JButton("Go to Menu B");
btMenuB.setBounds(0, 60, 200, 40);
MainMenuPanel.add(btMenuB);
btQuit = new JButton("Quit");
btQuit.setBounds(0, 120, 200, 40);
MainMenuPanel.add(btQuit);
}
public void createMenuAPanel(){
OptionsPanel.setLayout(null);
OptionsPanel.setVisible(false);
OptionsPanel.setBounds(100, 75, 300, 300);
add(OptionsPanel);
btMainMenu = new JButton("Back to MainMenu");
btMainMenu.setBounds(0, 40, 50, 20);
OptionsPanel.add(btMainMenu);
}
//################################################## --- Setter --- ##################################################
//
public void setMainMenuPanelVisible(Boolean bool){
MainMenuPanel.setVisible(bool);
}
public void setMenuAPanelVisible(Boolean bool){
MenuA.setVisible(bool);
}
}
[/Java]
[Java]
package listener;
import gui.GUI;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MainMenuListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent ae) {
if(ae.getSource() == GUI.btQuit){
//to do
}
else if(ae.getSource() == GUI.btMenuA){
//GUI.createMenuAPanel();
// vermutlich wäre es hier besser GUI.showMenuAPanel(); zu nutzen, aber das habe ich noch nicht
//implementiert
}
}
}
[/Java]
Das ganze ist natürlich nur eine Grobstruktur. Bei einigen Paneln fehlen noch Buttons, manchel Panel wurden garnicht genutzt. Ich würde gerne erstmal die Probleme die ich jetzt schon habe lösen .
Die Idee dahinter war, dass ich einfach die Sichtbarkeit (also Visible, nicht public oder so) der einzelnen Panel per Knopfdruck ändere um das entsprechende neue Menu zu zeigen.
Meine Fragen wären nun:
1. Ist es überhaupt eine gute Idee, das ganze so auf zu ziehen oder gibts das bessere Ansätze?
2. Beim MainMenuListener wird nun gesagt, dass ich die Buttons static machen muss. Verständlich, schließlich habe ich keine Instamz von GUI erzeugt, in dem der Button liegen soll. Wie kann ich das lösen? Denn ich möchte die Button eigentlich nicht static machen, der Listener soll ja nur was machen, wenn es auch tatsächlich einen Button gibt auf den er achtet.
Und extra in jedem einzelnen Listener neue Instanzen der Buttons zu erstellen kann ja auch nicht gerade Sinn der Übung sein.
3. Wie kann ich einen Quit-Button implementieren? In vorherigen Fällen habe ich meistens das Programm in einer Schleife gehabt und auf einen Bool reagieren lassen. Diese Programme waren allerdings immer ohne GUI, hier würde ich das nun gerne anders regeln.
Wenn ich den Listener in der GUI-Klasse implemeniere, könnte ich zwar
Code:
this.dispose();
So, ich bin mir sicher, dass mir noch zig weitere Fragen einfallen würden, aber erstmal sollte das genügen. Ich befürchte, das es einige grundlegende Java-Verständnissprobleme gibt, die ich beheben muss, aber gut, daher lerne ich das ganze ja.
Freue mich auf eure Antworten.
Khashayar
PS: Als ich in der Forums FAQ versucht habe mir die einzelnen Punkte anzuschaun ("Wie man Fragen richtig stellt" und "Wie kann ich ein Thema als [Erledigt] markieren?" insbesondere), kam folgende Fehlermeldung:
"Khashayar, Sie haben keine Rechte, um auf diese Seite zuzugreifen. Folgende Gründe könnten z.B. dafür verantwortlich sein:
Sie versuchen, den Beitrag eines anderen Benutzers zu ändern oder auf administrative Funktionen zuzugreifen. Überprüfen Sie bitte in den Forenregeln, ob Sie diese Aktion ausführen dürfen.
Wenn Sie versucht haben, einen Beitrag zu schreiben, kann es sein, dass Ihr Benutzerkonto deaktiviert wurde oder noch aktiviert werden muss."
Das ganze war auch noch da, nachdem ich meine Account durch die zugeschickten Link aktiviert habe. Sonst könnte ich glaube ich auch garnicht posten. Was könnte da das Problem sein?
Zuletzt bearbeitet: