Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo,

ich arbeite an einem Programm zur Datenmanipulation, es sollen Dateien geladen werden über eine Auswahlbox, verändert und wieder gespeichert werden.

Mein Problem sind nun die JFrames bzw. das JFrame.

Damit das Programm übersichtlich bleibt ist es in mehrere Klassen geteilt.

Mein Hauptprogramm erzeugt also ein Fenster und ruft die erste Klasse auf.In dieser Klasse wird eine JMenuBar erzeugt mit Items, desweiteren werden dort die Konstruktoren einiger anderen Klassen aufgerufen die das aktuelle JFrame erhalten, da diese Klassen auch mit dem JFrame arbeiten.

Mein Problem ist nun, das das ganze Programm scheinbar nicht mit nur einem Frame arbeitet, sondern versucht auf ein 2 bzw. 3 zuzugreifen.

------------------------

import javax.swing.*;

public class Hauptprog{

/**

* @param args

*/

public static final Menufenster Fenster = new Menufenster();

public static void main(String[] args) {

Fenster.pack();

Fenster.setSize(1000,700);

Fenster.setVisible(true);

}

}

-----------------

public Menufenster(){

super("mein prog");

addWindowListener(new WindowClosingAdapter(true));

menubar();

eigenschaften = new Ausgabe(this);

erstellen = new Button(this);

edit = new Bearbeiten(this);

erstellen.Buttonlayout();

}

-------

Wie bekomm ich es hin, das ich ein globales Hauptframe habe, auf das ich von jeder beliebigen Klasse aus zugreifen kann ?

public class Hauptprog{

	/**

	 * @param args

	 */

		public static void main(String[] args) {


	        Menufenster Fenster = new Menufenster();  <-- Objekt Erzeugung

	   	Fenster.pack();

		Fenster.setSize(1000,700);

		Fenster.setVisible(true);

}

}
import java.awt.*;

import java.awt.event.*;

import javax.swing.*;


public class Menufenster 

extends JFrame

{


	/**

	 * 

	 */

	private static final long serialVersionUID = -5662524236639740802L;


	private JMenuBar Menubar;

	private JMenu menu1,menu2,menu3,menu4;

	private JMenuItem item_load,item_save,item_exit,item_edit;


	/**

	 * @param args

	 */


	public Menufenster(){


		super("mein prog");

	       	addWindowListener(new WindowClosingAdapter(true));


	      menubar();  


	}
public void menubar(){


		 ActionListener listener = new ActionAdapter(this);

		 Menubar = new JMenuBar(); 

	     menu1 = new JMenu("Datei");

	     menu2 = new JMenu("Bearbeiten");

	     menu3 = new JMenu("Ansicht");

	     menu4 = new JMenu("Hilfe");

	     item_load = new JMenuItem("Datei laden..." ,'l');

	     setCtrlAccelerator(item_load, 'L');

	     item_save = new JMenuItem("Datei speichern...", 's');

	     setCtrlAccelerator(item_save, 'S');

	     item_exit = new JMenuItem("Beenden", 'B');

	     setCtrlAccelerator(item_exit, 'B');

	     item_edit = new JMenuItem("Audiodatei",'A');

	     setCtrlAccelerator(item_edit, 'A');

	     menu1.setMnemonic('D');

	     menu2.setMnemonic('B');

	     menu3.setMnemonic('A');

	     menu4.setMnemonic('H');

	     menu1.add(item_load);

	     menu1.add(item_save);

	     menu1.addSeparator();

	     menu1.add(item_exit);

	     Menubar.add(menu1);

	     menu2.add(item_edit);

	     Menubar.add(menu2);

	     Menubar.add(menu3);

	     Menubar.add(menu4);


	     Menubar.setBorder(BorderFactory.createEtchedBorder());

	     getContentPane().add(Menubar, BorderLayout.NORTH);


	     item_load.addActionListener(listener);

	     item_exit.addActionListener(listener);

	     item_save.addActionListener(listener);

	     item_edit.addActionListener(listener);


	}

hier mal der komplette Quelltext zur ersten Klasse..das Objekt Fenster was im Hauptprog erstellt wird, wird ja meines erachtens ja von JFrame abgleitet.Im Detail passiert dies in der Klasse Menufenster...

Das funktioniert ja auch alles soweit.Die Frage ist halt nur ob das so ok ist, wenn ich global auf dieses erzeugte JFrame zugreifen will ? Bzw. was müsste ich vielleicht anders machen ?

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;


public class Menufenster 

extends JFrame

{ [....]


	public Menufenster(){


		super();

	       	addWindowListener(new WindowClosingAdapter(true));


	      menubar();  


	}


Änder es mal bitte so ab

Phil

Hab ich gemacht, aber das ändert nix am Programm...hab immernoch das Problem .

Wie kann ich dieses JFrame jetzt so handhaben das es von jeder anderen Klassen benutzt werden kann.....und vorallem das nur genau das benutzt wird ?

public class Hauptprog{

	/**

	 * @param args

	 */

		public static void main(String[] args) {


	        Menufenster Fenster = new Menufenster();  <-- Objekt Erzeugung

	   	Fenster.pack();

		Fenster.setSize(1000,700);

		Fenster.setVisible(true);

}

}

Lokale Variable. Darauf wirst du nicht mit Standardmitteln zugreifen können.

Also entweder du übergibst es als Parameter, deklarierst die Klasse als Singleton oder machst einen static member in den Launchen.

Ich persönlich bin für Ersteres.


import javax.swing.*;


public class Hauptprog{



	/**

	 * @param args

	 */


	public static void main(String[] args) {


	        Menufenster Fenster = new Menufenster();	

	   	new Button(Fenster);

	   	new Ausgabe(Fenster);

	   	new ActionAdapter(Fenster);

	        Fenster.pack();

		Fenster.setSize(1000,700);

		Fenster.setVisible(true);


	}

}

Also müsste ich das so machen nehm ich an...Mein Problem ist jetzt der ActionAdapter...der wird zweimal aufgerufen...einmal wie oben im Menufenster und einmal in der Klasse Button...Ich habe einmal datei laden im Menufenster und einmal als Button am unteren teil des JFrames. Wenn ich jetzt über datei laden mittels button gehe dann macht der alles wunderbar....es öffnet sich eine auswahlbox in der ich meine datei auswählen kann...dann ok drücken und die datei steht mit ihrem quellpfad in meiner liste...drück ich jetzt nochmal den button datei laden, so wird dieses JList Fenster wieder gelöscht, so wie ers machen soll. Der Hacken ist jetzt aber, wenn ich einmal über den button lade und danach über den menü eintrag "datei laden" gehe dann tut er dies nicht...es hat den anschein als würden sich das alte fenster und das neue überlappen...und das soll nicht sein.

Warum mischst du AWT und Swing?!

Warum lässt du nicht alle Unterobjekte (menubar, Buttons, ...) gleich im JFrame erzeugen?!

Da bräuchtest du von außen auch keinen AL auf die Unterelemente zu instanziieren, sondern machst das ein mal im Konstruktor.

Wenn du zwei (oder mehr) Aktionlistener erzeugst, werden bei einem Event alle benachrichtigt, dass ist dann klar, dass es zu einer doppelten Ausführung kommen kann.

Hmmm...klingt logisch :) also werd ich das mal bissl umbaun...die buttons und menubar in einer klasse unterbringen...dann hab ich nurnoch einen aktionlistener..

Ah...jetzt weiß ich erstmal auf was du das bezogen hast :upps...Nicht verwirren lassen...das new Button ist nur meine Klasse in der ich dann aber JButtons erstelle :D

Probelm gelöst...mit einem Actionadapter gehts besser und hatte meine Konstrukturen aufrufe in der falschen Klasse gesetzt...Dank an alle die sich mit meinem Problem auseinandergesetzt haben :)

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.