StatusBar Optik wie JMenuBar; GUI-Erzeugung delegieren

itsmemario

Grünschnabel
Hallo,

ich hätte da mal zwei Fragen:

1. Ich würde gerne eine StatusBar erzeugen. An und für sich ja auch kein Problem, indem ich von JPanel ableite. Mein Problem ist jetzt allerdings, dass ich gerne den "umgekehrten Look" einer JMenuBar hätte. D.h., oben eine Art Trennlinie und dann den gräulichen Verlauf der JMenuBar. Ich hab' auch schon mal im Quelltext der JMenuBar geschaut, aber zum Verlauf leider gar nichts gefunden und was die Trennlinie betrifft, hab' ich nur die Methode setborderPainted(boolean b) gefunden. Wobei ich mich auch da Frage, wie ich die Trennlinie hinbekomme, denn die normalen Rahmen, die man mittels der BorderFactory zeichnen kann, sind an allen vier Seiten einer Komponente sichtbar. Bei einer JMenuBar handelt es sich aber um eine Trennlinie, die nur unten sichtbar ist (und in meiner StatusBar oben sichtbar sein soll).

2. Die zweite Frage ist ein wenig philosophisch. Ich habe eine Klasse UserInterface, die mein GUI erzeugt. In meinem Fall ist es allerdings so, dass allein die Erzeugung der JMenuBar aufgrund von Accelerators, Mnemonics und relativ vielen Einträgen schon viele Codezeilen beansprucht. Der Code an sich ist wenig anspruchsvoll, aus Gründen der Strukturierung und Lesbarkeit würde ich ihn dennoch gerne auslagern. Mir stellt sich momentan die Frage, welches die eleganteste Möglichkeit ist. Eine Möglichkeit wäre z.B. eine Klasse MyMenuBar, die von JMenuBar erbt und das Menü entweder direkt im Konstruktor erzeugt, oder eine Methode createMyMenuBar aufruft, die mir das Menü zurückliefert. Eine zweite Möglichkeit wäre einfach eine Klasse, in der eine statische Methode vorhanden ist, die mir die JMenuBar erstellt (die Methode müsste nicht zwangsläufig static sein, aber wozu wollte man diese Klasse erst instanziieren, um dann mit einem weiteren Aufruf das Menü zu erzeugen). Dies hätte den Vorteil, dass In dieser Klasse weitere GUI-Elemente erzeugt wedern könnten.

Erzeugung im Konstruktor:
Code:
public class MyMenuBar extends JMenuBar {

public MyMenuBar() {
super();
super.add(new JMenuItem());
...
}

}

Im UserInterface würde dann folgender Code benötigt:
Code:
JFrame mainWindow = new JFrame();
mainWindow.setJMenuBar(new MyMenuBar());

Andere Möglichkeit, Konstruktor ruft Methode zur Erzeugung auf:
Code:
public class MyMenuBar extends JMenuBar {

public MyMenuBar() {
super();
createMyMenuBar(this);
}

private void createMyMenuBar(JMenuBar myMenuBar) {
myMenuBar.add(new JMenuItem());
...
}

}

Gleicher Code im UserInterface benötigt:
Code:
JFrame mainWindow = new JFrame();
mainWindow.setJMenuBar(new MyMenuBar());

Klasse mit statischer Methode zur Erzeugung des Menüs (und evtl. weiterer Komponenten):
Code:
public class GuiElements {

public static JMenuBar createMyMenuBar() {
JMenuBar myMenuBar = new JMenuBar();
myMenuBar.add(new JMenuItem());
...
return myMenuBar;
}

public static JPanel createAnotherGuiElement() {
JPanel myPanel = new JPanel();
...
return mPanel;
}

}

Im UserInterface würde dann folgender Code benötigt:
Code:
JFrame mainWindow = new JFrame();
mainWindow.setJMenuBar(GuiElements.createMyMenuBar);

Der Wunsch ist also, die Klasse UserInterface (die u.a. das JFrame erzeugt) zu verschlanken. Die letzte Alternative birgt in meinen Augen die Gefahr, dass man quasi alle Komponenten in ihr erzeugt, d.h. man alle Komponenten die ich normalerweise in der Klasse UserInterface erzeugt hätte nun in einer anderen klasse erzeuge, d.h. eine schlanke Klasse UserInterface bekomme, dafür eine andere Klasse vollgepackt wird und das Problem somit nur von einer Klasse in eine andere verlagert wird.

Ideen und Anregungen sehr willkommen.

Grüße,
 
Zuletzt bearbeitet:
Zurück