Fragen zur JMenuBar & Co.

qexxler

Aktives Mitglied
Schönen guten Abend bzw. guten Morgen,

nachdem ich vergangene Tage meine erste kleine Software geschrieben habe, dessen Code ich bald einmal für alle zur Verfügung stellen werde, habe ich einige Fragen zum Design von einer JMenuBar und Co. Mit Co meine ich JMenus und JMenuItems.

Ich habe in meiner Start Klasse, wie auch immer sie heißen mag eine Instanz-Variable
Java:
 private JFrame frame;
Im Konstruktor initialisiere ich alle wichtige Daten und erstelle mir zum erstellen meiner JMenuBar eine entsprechende Methode
Java:
 private void initMenuBar()
.
In dieser Methode implentiere ich für jedes JMenuItem meiner MenuBar und Co als anonyme Klasse jeweilse das ActionListener-Interface und rufe ich der entsprechenenden actionPerformed - Methode eine entsprechende Funktion auf, die nach dem Klick, z.B. Datei -> Neu, ausgeführt werden soll.

Nun bin ich mir nicht sicher, ob das der richtige Weg ist, ein solches Menu aufzubauen, oder ob es einen objektorientierten Weg gibt, sich eine JMenuBar aufzubauen.

Wenn ihr Code benötigt, was das ganze noch besser zur Geltung bringt, lasst es mir wissen.

Mir scheint es nur der Fall zu sein, dass das kein gutes Design ist. Und da ich es gerne richtig machen möchte und hierzu keine speziellen Informationen im Internet gefunden habe, wollte ich hier einmal nachfragen.

Denn wie eine JMenuBar aufgebaut wird ist klar.

Ich hoffe, ihr versteht meine Frage. Ist schon spät, ich weiß.
 

qexxler

Aktives Mitglied
Einen schönen guten Morgen zusammen,

hier noch einmal ein kleines, ausführbares Programm was obiges Thema zeigen soll.

Java:
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;

public class JMenuBarDemo {

	private JFrame frame;
	private JMenuBar menuBar;
	private JMenu menuDatei;
	private JMenuItem menuDateiSpeichern, menuDateiLaden;

	public JMenuBarDemo() {
		frame = new JFrame();
		frame.setTitle("JMenuBarDemo - Java-forum.org");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		/* Initialisieren der Komponenten */
		initMenuBar();
		addAction();

		frame.pack();
		frame.setLocationRelativeTo(null);
	}

	/* Initialisieren der MenuBar */
	private void initMenuBar() {

		menuBar = new JMenuBar();
		menuDatei = new JMenu("Datei");
		menuDateiSpeichern = new JMenuItem("Speichern");
		menuDateiLaden = new JMenuItem("Laden");

		menuDatei.add(menuDateiSpeichern);
		menuDatei.add(menuDateiLaden);
		menuBar.add(menuDatei);

		frame.setJMenuBar(menuBar);

	}

	private void addAction() {

		/* ActionListener : menuDateiSpeichern */
		menuDateiSpeichern.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				actionSpeichern();
			}
		});

		/* ActionListener : menuDateiLaden */
		menuDateiLaden.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				actionLaden();
			}
		});
	}

	private void actionLaden() {
		/* Hier wird eine beliebige Aktion ausgeführt */
		System.out.println("... laden ...");
	}

	private void actionSpeichern() {
		/* Hier wird eine beliebige Aktion ausgeführt */
		System.out.println("... speichern ...");
	}

	/* Setzt die Sichtbarkeit auf 'visible' */
	public void setVisible(boolean visible) {
		frame.setVisible(visible);
	}

	/* Applikation wird gestartet */
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				JMenuBarDemo frame = new JMenuBarDemo();
				frame.setVisible(true);
			}
		});
	}
}

Was möchte ich nun genau wissen?
Es geht mir darum, wie man es in einer größeren Software mit der JMenuBar und deren Items richtig strukturiert. Ich bin mir nicht ganz sicher, ob mein obiges Programm, als Grundgerüst dienen kann. Mein zweiter Gedanken heute Nacht war, ob es nicht auch funktionieren würde, wenn ich für jedes JMenu eine eigene Klasse mache und dann einfach nur eine neue Instanz an das JMenuBar des Frame adde. Da stellte sich mir aber das Problem, wie ich die Informationen des Frame gut in die Klasse des entsprechenden JMenus bekomme, ohne im entsprechenden des JMenus Konstruktur eine lange Liste von Parameter mitzugeben, die es braucht um an die Informationen zu kommen, zumal es mir scheint, dass sich dadurch Redundanzen ergeben, da ich das bei allen anderen JMenus auch machen muss.


Um es zu zeigen, habe ich obigen Code etwas erweitert.

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;

public class JMenuBarDemo {

	private JFrame frame;
	private JMenuBar menuBar;
	private JMenu menuDatei;
	private JMenuItem menuDateiSpeichern, menuDateiLaden;

	public JMenuBarDemo() {
		frame = new JFrame();
		frame.setTitle("JMenuBarDemo - Java-forum.org");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		/* Initialisieren der Komponenten */
		initMenuBar();
		addAction();

		frame.pack();
		frame.setLocationRelativeTo(null);
	}

	/* Initialisieren der MenuBar */
	private void initMenuBar() {

		menuBar = new JMenuBar();
		menuDatei = new JMenu("Datei");
		menuDateiSpeichern = new JMenuItem("Speichern");
		menuDateiLaden = new JMenuItem("Laden");

		menuDatei.add(menuDateiSpeichern);
		menuDatei.add(menuDateiLaden);
		menuBar.add(menuDatei);
		menuBar.add(new MenuOptionen().getJMenu());

		frame.setJMenuBar(menuBar);

	}

	private void addAction() {

		/* ActionListener : menuDateiSpeichern */
		menuDateiSpeichern.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				actionSpeichern();
			}
		});

		/* ActionListener : menuDateiLaden */
		menuDateiLaden.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				actionLaden();
			}
		});
	}

	private void actionLaden() {
		/* Hier wird eine beliebige Aktion ausgeführt */
		System.out.println("... laden ...");
	}

	private void actionSpeichern() {
		/* Hier wird eine beliebige Aktion ausgeführt */
		System.out.println("... speichern ...");
	}

	/* Setzt die Sichtbarkeit auf 'visible' */
	public void setVisible(boolean visible) {
		frame.setVisible(visible);
	}

	/* Applikation wird gestartet */
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				JMenuBarDemo frame = new JMenuBarDemo();
				frame.setVisible(true);
			}
		});
	}
	
	/* ***  Private innere Klasse für die Optionen *** */
	
	public class MenuOptionen {

		private JMenu menuOptionen;
		private JMenuItem menuOptionenSprache, menuOptionenEinstellungen;
		
		public MenuOptionen() {
			menuOptionen = new JMenu("Optionen");
			menuOptionenSprache = new JMenuItem("Sprache wählen");
			menuOptionenEinstellungen = new JMenuItem("Einstellungen");
			
			
			menuOptionen.add(menuOptionenSprache);
			menuOptionen.add(menuOptionenEinstellungen);
			
			addAction();
		}
		
		private void addAction() {
			menuOptionenSprache.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					actionChoice();
				}
			});
			
			menuOptionenEinstellungen.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					actionEinstellungen();
				}
			});
		}

		private void actionChoice() {
			System.out.println("... Sprache wählen ...");
		}
		
		
		private void actionEinstellungen() {
			System.out.println("... Einstellungen ...");
		}
		
		public JMenu getJMenu() {
			return menuOptionen;
		}
	}

}


Ihr müsste euch vorstellen, dass diese innere Klasse MenuOptionen eben keine innere Klasse ist, sondern eine eigenständige. Habe es nur zur Verfeinfachung so gewählt.
 
Zuletzt bearbeitet:

Bartertown

Mitglied
Was würde dagegen sprechen nur Action-Objekte zu benutzen.
z.B.

private Action actSave=new AbstractAction(){
@Override
public void actionPerformed(ActionEvent e){
//...handle event
}
};

Man hat die Möglichkeit elegant Werte festzulegen:

private void putActionValues(){
actSave.putValue(Action.NAME,"Datei speichern");
actSave.putValue(Action.ACCELERATOR_KEY,Keystroke.getKeystroke(KeyEvent.VK_S,InputEvent.CTRL_MASK);
actSave.putValue(Action.SMALL_ICON,new IconImage(getClass().getRessource("icon.png"))
//...
}

Jedes Menu kann man mit einer Methode erzeugen:

private JMenu createFileMenu(){
JMenu jmenu=new JMenu("File");
jmenu.add(new JMenuItem(actSave));
//jmenu.add...
return jmenu;
}


Viele Grüße (-_-J)
 

qexxler

Aktives Mitglied
Guten Morgen zusammen und hallo Bartertown,

zunächst einmal vielen Dank für deinen Post und dafür, dass du dir die Zeit genommen hast, dir meinen Code eventuell durchzulesen.

Was deinen Vorschlag angeht, werde ich heute mal darüber nachdenken und schauen, ob es mir in meinem Denken weiter hilf.

Einen schönen Sonntag.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
thor_norsk Allgemeine Fragen AWT, Swing, JavaFX & SWT 6
thor_norsk Allgemeine Fragen AWT, Swing, JavaFX & SWT 4
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
K JavaFX Allgemeine Fragen zu dem Aufbau eines Programms hinsichtlich der Klassen AWT, Swing, JavaFX & SWT 1
D Fragen zur GUI AWT, Swing, JavaFX & SWT 4
M NetBeans JFrame Grundlangen fragen AWT, Swing, JavaFX & SWT 6
T JavaFX Allgemeine Fragen zu JavaFX (uA zu Properties) AWT, Swing, JavaFX & SWT 6
D Panel wird nicht angezeigt und Fragen zum CardLayout AWT, Swing, JavaFX & SWT 6
K Fragen zu JavaFx Canvas AWT, Swing, JavaFX & SWT 0
N Swing Fragen zu non-modal JDialog AWT, Swing, JavaFX & SWT 1
F DefaultTreeCellEditor - Fragen zur Groesse und zum Icon beim Editieren AWT, Swing, JavaFX & SWT 4
Kenan89 JMenu Fragen AWT, Swing, JavaFX & SWT 5
Luk10 (LWJGL) Fragen zu VBOs AWT, Swing, JavaFX & SWT 21
M Swing JTextPane + Scrollbar = Fragen AWT, Swing, JavaFX & SWT 15
S Fragen zu JList AWT, Swing, JavaFX & SWT 3
J Das erste Projekt und ein Haufen von Fragen. Der SudokuReader. AWT, Swing, JavaFX & SWT 4
Luk10 Fragen zum Laden von Fonts AWT, Swing, JavaFX & SWT 4
Luk10 Fragen zum Koordinaten System AWT, Swing, JavaFX & SWT 3
M JTable Grundlegende Fragen AWT, Swing, JavaFX & SWT 4
B Prozentrechner GUI Fragen AWT, Swing, JavaFX & SWT 4
H Fragen zu JPanel und JButton AWT, Swing, JavaFX & SWT 3
Q Swing Zeichenprogramm, grundlegende Fragen AWT, Swing, JavaFX & SWT 8
U Swing Fragen bezüglich Multithreaded GUIs (Grundlagen): AWT, Swing, JavaFX & SWT 3
R LayoutManager GridBagLayout Fragen AWT, Swing, JavaFX & SWT 10
A diverse Layout-Fragen AWT, Swing, JavaFX & SWT 4
M LayoutManager Einige Fragen zum GridBagLayout AWT, Swing, JavaFX & SWT 13
H Swing Zwei Fragen AWT, Swing, JavaFX & SWT 5
S 2D-Grafik Diverse Fragen zu Imagemanipulation in Java AWT, Swing, JavaFX & SWT 11
C Swing Grundsätzliche Fragen zu MVC AWT, Swing, JavaFX & SWT 8
F 3 Fragen zu Applets AWT, Swing, JavaFX & SWT 4
L Klick auf JTable -> EditorPane manipulieren, Fragen zu TableModel AWT, Swing, JavaFX & SWT 9
S Fragen zu GridBagLayout AWT, Swing, JavaFX & SWT 6
B Zeichnen in Swing - Jede Menge Fragen! AWT, Swing, JavaFX & SWT 2
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
D GridBagLayout und JEditorPane (mehrere fragen) AWT, Swing, JavaFX & SWT 2
A Swing einfache fragen zu frame AWT, Swing, JavaFX & SWT 10
P Mehrere Fragen AWT, Swing, JavaFX & SWT 4
A Fragen zu Microber AWT, Swing, JavaFX & SWT 4
C Mehrer Fragen zu großem kompletten Swing Beispiel AWT, Swing, JavaFX & SWT 5
T Fragen zu JList und DnD AWT, Swing, JavaFX & SWT 13
I Einige Fragen zu JList AWT, Swing, JavaFX & SWT 6
I Drei Fragen/Probleme mit einer JTable AWT, Swing, JavaFX & SWT 9
G Fragen zum FileChooser AWT, Swing, JavaFX & SWT 5
M 2 Kleine Fragen zum JOptionFrame AWT, Swing, JavaFX & SWT 5
G performance fragen zu AWT, Swing AWT, Swing, JavaFX & SWT 14
J Fragen zu JTable und JScrollpane AWT, Swing, JavaFX & SWT 2
R Frage zu Listfeld oder jTable, auch andere Fragen AWT, Swing, JavaFX & SWT 5
C Fragen zur Darstellung einer JTable mittels Renderer AWT, Swing, JavaFX & SWT 2
ModellbahnerTT Fragen zu AWT AWT, Swing, JavaFX & SWT 3
S Fragen Databinding? AWT, Swing, JavaFX & SWT 3
J Fragen zu AWT Komponenten AWT, Swing, JavaFX & SWT 5
U 2 Fragen zu BufferedImages AWT, Swing, JavaFX & SWT 19
J Fragen zur Vererbung und Update AWT, Swing, JavaFX & SWT 12
J Fragen zum SyntaxHighlighting (DefaultStyledDocument) AWT, Swing, JavaFX & SWT 2
I Ein paar SWT Fragen AWT, Swing, JavaFX & SWT 10
P Zwei Fragen zu Bildern in Applets AWT, Swing, JavaFX & SWT 2
isowiz Einige Fragen zur ersten eigenen Sing-Applikation AWT, Swing, JavaFX & SWT 4
G 2 Fragen JDesktopPane AWT, Swing, JavaFX & SWT 4
S Fragen zu einem Beispiel(Swings und AWT) AWT, Swing, JavaFX & SWT 33
G Fragen zum Ocean Look and Feel AWT, Swing, JavaFX & SWT 3
G Neue Komponente erstellen - Fragen/Probleme mit MouseEvents AWT, Swing, JavaFX & SWT 2
Y 2 Fragen- JList Inhalt ändern und Fenster invisible setzen AWT, Swing, JavaFX & SWT 5
C Gemischte Fragen AWT, Swing, JavaFX & SWT 10
G Fragen zu JList AWT, Swing, JavaFX & SWT 12
K 2 fragen:JCheckBoxMenuItem und ComboBox AWT, Swing, JavaFX & SWT 2
T Mehrere Fragen zu JToolBar AWT, Swing, JavaFX & SWT 2
N 2 Fragen (zu binärem Suchen und Scrollbar) AWT, Swing, JavaFX & SWT 6
B Einige Fragen zum GUI AWT, Swing, JavaFX & SWT 3
C JMenuBar AWT, Swing, JavaFX & SWT 6
K Event Handling Über JMenuBar die diversen Panels anzeigen AWT, Swing, JavaFX & SWT 10
J Swing JMenuItem blockiert JMenuBar AWT, Swing, JavaFX & SWT 2
S JMenuBar bei sichtbarer JGlassPane AWT, Swing, JavaFX & SWT 1
R JMenuBar.setFont tut nix ? AWT, Swing, JavaFX & SWT 1
I Swing JMenuBar auch unten am JFrame? AWT, Swing, JavaFX & SWT 2
A Swing JMenuBar updaten AWT, Swing, JavaFX & SWT 2
kaoZ Swing JMenuBar, Preferences, Properties... und viele andere lustige Dinge (Best Practice) AWT, Swing, JavaFX & SWT 15
Q Designfrage zur JMenuBar AWT, Swing, JavaFX & SWT 6
S JMenuBar wiederverwenden und Eventhandling anpassen AWT, Swing, JavaFX & SWT 4
B Swing JMenuBar unten in der Frame setzen? AWT, Swing, JavaFX & SWT 15
M Über eine JMenuBar überprüfen ob ein JCheckBoxMenuItem selectiert ist. AWT, Swing, JavaFX & SWT 4
M JMenuBar, JMenu, JMenuItem wird nicht angezeigt AWT, Swing, JavaFX & SWT 16
G Swing JMenuBar zu weit links und oben dargestellt AWT, Swing, JavaFX & SWT 5
B Swing Dynamische JMenuBar AWT, Swing, JavaFX & SWT 2
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
D JMenuBar - CardLayout (Klasse anzeigen) AWT, Swing, JavaFX & SWT 3
S JMenuBar Frame Abstand AWT, Swing, JavaFX & SWT 3
H jMenuBar AWT, Swing, JavaFX & SWT 13
NR_EIGHT Swing Probleme mit JMenuBar AWT, Swing, JavaFX & SWT 6
M JMenuBar im Applet und paint AWT, Swing, JavaFX & SWT 9
Madlip JMenuBar in JFrame AWT, Swing, JavaFX & SWT 5
B JFrame / JMenuBar => Anfängerprobleme AWT, Swing, JavaFX & SWT 2
R JMenuBar AWT, Swing, JavaFX & SWT 2
S JMenuBar nach 1. Klick deselectieren AWT, Swing, JavaFX & SWT 6
Z JMenuBar wird nicht in JFrame angezeigt AWT, Swing, JavaFX & SWT 2
N JMenuBar verschwindet nicht nach ComponentEvent AWT, Swing, JavaFX & SWT 6
C JMenuBar aktualisieren? AWT, Swing, JavaFX & SWT 2
A Doppelte JMenuBar AWT, Swing, JavaFX & SWT 2
X NullPointerException beim Einfügen einer JMenuBar AWT, Swing, JavaFX & SWT 4
C JMenuBar im JFrame abgehackt AWT, Swing, JavaFX & SWT 7
J Swing JFrame mit JMenuBar, allerdings ohne Erfolg AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben