Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
nicht-statische Inhalte auf statische Inhalte verweisen
ich steht vor einem kleinen Problem was ich euch anhand code snippets von mir darstellen möchte:
Code:
public static void createGUI(){
final JFrame f = new JFrame("Analyzer");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(display);
f.getContentPane().setLayout(new FlowLayout());
f.setSize(display.getHeight(), display.getWidth());
f.pack();
f.setVisible(true);
}
public void addMenu(JFrame f){
/* Sets the menubar */
f.setMenuBar(this);
Menu fileMenu = new Menu("Datei");
Menu fileMenu2 = new Menu("Bearbeiten");
Menu fileMenu3 = new Menu("Info");
add(fileMenu);
add(fileMenu2);
add(fileMenu3);
//noch mehr code - ist jedoch hier nicht relevant
}
public static void main(String[] args) {
Interface i = new Interface();
i.addMenu(f); // <== Hier ist "f" nicht einsetzbar
display = new PerformanceProfile();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createGUI();
}
});
}
Nur zur Problematik :
Ich habe ein JFrame in einer statischen Methode erstellt (ja es muss leider static sein - gründe liegen in unserer Projektorganisation)
Analog zu diesem JFrame würde ich gerne noch eine MenuBar erstellen - dies liegt in einer "normalen" void methode. Wie bekomme ich es nun hin die Menubar zu diesem JFrame zu erstellen - ich habe hierbei primär Probleme damit statischen Inhalt auf nicht-statischen Inhalt (der Menubar) zu verweisen ?
danke schonmal im vorraus für Hints oder Denkansätze
"Herzlichen Dank" von meiner Seite aus - diese Gratulation darfst du nun neun mal (aber bitte nicht öfter) noch machen ^^
Ich würde zudem gerne alles auf static setzten, doch bei Menubar geht es nicht - sprich diesen Block:
Code:
public void addMenu(JFrame f){
/* Sets the menubar */
f.setMenuBar(this);
Menu fileMenu = new Menu("Datei");
Menu fileMenu2 = new Menu("Bearbeiten");
Menu fileMenu3 = new Menu("Info");
add(fileMenu);
add(fileMenu2);
add(fileMenu3);
//noch mehr code - ist jedoch hier nicht relevant
}
kann man nicht einfach in static umschreiben - da add(fileMenu); & co aus einem non-static Bereich hervorgehen.
hihi - nun versteh ich warum static wenn du nicht weißt wie eine Instanz erzeugen
Instanzen werden per new erzeugt
also
Code:
List eineListe = new ArrayList();
somit hast du eine Instanz einer ArrayList erzeugt. Mit dieser Instanz kannst du dann auf methoden der Klasse zugrifen
edit:
.
Code:
Interface i = new Interface();
hier habt ihr doch eine Instanz erzeugt ?!
ich tipp mal wieder so ins Blaue was ihr machen wollt bzw. geb mal n tipp ab.
Das ganze soll eine Gui werden - Interface ist irgendeine Klasse, die ihr zum anzeigen verwendet wollt (schließlich willst du darin dein menu haben). Bitte überlegt euch euer Design noch 1, 2x.
Z.b. macht eine Klasse (z.b. Interface) die von JFrame erbt. Somit könnt ihr diese dann als Hauptklasse für die GUI ansehen. in dieser Klasse könnt ihr dann z.b. eine Methode (nicht static *g) haben, die euch ein Menu erstellt.....
Ich hab eine Instanz von der Klasse - und ich habe daran addMenu aufgerufen und dem als Parameter das Frame übergeben - oder versteh ich das jetzt völlig falsch ? *noch mehr verwirrt sei*
Code:
public static void main(String[] args) {
Interface i = new Interface(); //<== Instanz erzeugt
i.addMenu(f); //<== addMenu aufgerufen und als Parameter JFrame f übergeben
}
also die static-Geschichte ist eigentlich was Besonderes was man nur aus ganz bestimmten (Projekt- :lol: ) Gründen einsetzt. Da ich nicht weiß, wie deine Klasse heißt, denk ich mir mal eine aus:
Code:
public class ProjektMenu extends JMenuBar {
public void addMenu (JFrame f) {
/* Sets the menubar */
f.setMenuBar(this);
Menu fileMenu = new Menu("Datei");
Menu fileMenu2 = new Menu("Bearbeiten");
Menu fileMenu3 = new Menu("Info");
add(fileMenu);
add(fileMenu2);
add(fileMenu3);
//noch mehr code - ist jedoch hier nicht relevant
}
}
in der static-Methode kann das dann so verwendet werden:
Code:
public static void createGUI () {
final JFrame f = new JFrame("Analyzer");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(display);
f.getContentPane().setLayout(new FlowLayout());
f.setSize(display.getHeight(), display.getWidth());
// und jetzt das Menu
ProjektMenu menu = new ProjektMenu();
menu.addMenu(f);
f.pack();
f.setVisible(true);
}
und wenn ich mir das so anschaue, würde ich dir empfehlen, das leicht abzuwandeln, und zwar so:
Code:
public class ProjektMenu extends JMenuBar {
public ProjektMenu () {
createMenu();
}
public void createMenu () {
Menu fileMenu = new Menu("Datei");
Menu fileMenu2 = new Menu("Bearbeiten");
Menu fileMenu3 = new Menu("Info");
add(fileMenu);
add(fileMenu2);
add(fileMenu3);
//noch mehr code - ist jedoch hier nicht relevant
}
}
das ist nun das reine Menu ohne Bezug auf irgendein Frame. Der kommt dann hier:
Code:
public static void createGUI () {
final JFrame f = new JFrame("Analyzer");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(display);
f.getContentPane().setLayout(new FlowLayout());
f.setSize(display.getHeight(), display.getWidth());
// und jetzt das Menu
ProjektMenu menu = new ProjektMenu();
f.setMenuBar(menu);
f.pack();
f.setVisible(true);
}
dank eurer Hilfe konnte ich diverse weitere Probleme lösen, doch nun steh ich vor einem Problem welches ich nicht so leicht lösen kann.
basierend auf die methode:
Code:
public static void createGUI () {
final JFrame f = new JFrame("Analyzer");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ProjektMenu menu = new ProjektMenu();
f.setMenuBar(menu);
f.pack();
f.setVisible(true);
}
hab ich noch eine methode
Code:
public void saveFile(JFrame f){
FileDialog fd = new FileDialog(f, "Save File",
FileDialog.SAVE);
fd.show(); // Display dialog and wait for response
// --einige try-catch komponenten die für das Problem nicht relevant sind
}
Nun hab ich noch die methode "ActionPerformed" vom actionListener
Code:
public void actionPerformed(ActionEvent e){
if (e.getActionCommand()=="WLA"){
saveFile(f); //<== Problem
}
}
Der ActionListener bzw. die methode ActionPerformed dient dazu um beim klicken auf ein MenuItem den Speicher Dialog zu öffnen.
Nun besteht genau hierbei das Problem, das ich in der methode actionPerformed nicht "saveFile(f)" schreiben kann, da JFrame f in der methode nicht bekannt ist - wie ist es möglich dennoch einen erfolgreichen Verweis in actionPerformed auf JFrame zu machen ?
Wo ist denn das actionPerformed ist das ne eigene Klasse dann solltest du das im Konstruktor übergeben ist das die gleiche Klasse kannst du this verwenden.
Hab ich sowas nicht heute schon mal geschrieben ???:L
actionPerformed ist eine methode von ActionListener innerhalb der Klasse "Interface" (entschuldigung das ich das net miterwähnt habe !)
das würde bei der Klasse dann so aussehen:
Code:
public class Interface implements ActionListener{
public void actionPerformed(ActionEvent e){
5
6
7
8
9
public void actionPerformed(ActionEvent e){
if (e.getActionCommand()=="WLA"){
saveFile(f); //<== Problem
}
}
}
Das Problem ist das (f) sprich das JFrame leider als unbekannt in der methode actionPerformed galt
und wenn ich "this.saveFile(f);" steht dann "f cannot be resolved"
So, ich habe nun versucht JFrame f welches nur in der methode
public static void createGUI () vorliegt nun als Attribut in der Klasse Interface anzugeben -
private JFrame f;
Wenn ich dies mache verschwindet der Fehler bei actionPerformed
this.saveFile(f) - doch es erscheint im Gegenzug dann folgende Fehlermeldung:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: null owner window
at java.awt.Window.ownedInit(Unknown Source)
at java.awt.Window.<init>(Unknown Source)
at java.awt.Dialog.<init>(Unknown Source)
at java.awt.FileDialog.<init>(Unknown Source)
at Interface.saveFile(Interface.java:133)
at Interface.actionPerformed(Interface.java:157)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at
...restliche Verweise ausgelassen
bei Interface.saveFile(Interface.java:133)
zeigt es auf
FileDialog fd = new FileDialog(f, "Save File",FileDialog.SAVE);
und bei
at Interface.actionPerformed(Interface.java:157) zeigt es auf
Heiliger Strohsack ...und ich hab die variable auf private gestellt *hand_vor_stirn_knall* herzlichen dank nochmal - dies ist eines dieser Fehler gewesen die ich nicht so schnell vergessen werde ^^