Frage und Verbesserungsvorschlag zu Klasse gesucht

d3x1984

Grünschnabel
EDIT
Frage 1 hat sich erledigt daher auch nun hab ich den aktuellen code eingefügt

Frage 2 ist:
Ich will dem ActionListener nun sagen das wenn Quit ausgelöst wird,
das dispose(), System.exit(0) ausgelöst wird.
wie kann ich das hier richtig umsetzen?

was ist besser ein listener der auf das ganze fenster achte oder für
jeden menüpunkt einzeln?

vielen dank für die hilfe und vorschläge im vorraus =))

Code:
package WalletTool;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class WalletTool {

	public static class MainWindow extends JFrame {
		private static final long serialVersionUID = 3595405672999869797L;
		
		//Konstruktor MainWindow
		public MainWindow(final String title) {
			super(title);
			// Konstante Werte des Gesamten Fensters
			setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			setSize(800,600);
						
			// Menubar Erzeugen
			final JMenuBar menubar = new JMenuBar();
			
			// Menupunkte Erzeugen
			final JMenu file = new JMenu("File");
			final JMenu help = new JMenu("Help");
			
			// Untermenupunkte File Anlegen
			final JMenuItem character = new JMenuItem("Add Charakter");
			final JMenuItem save = new JMenuItem("Save Settings");
			final JMenuItem restore = new JMenuItem("Restore Settings");
			final JMenuItem quit = new JMenuItem("Quit");
			
			//Untermenupunkte Help Anlegen
			final JMenuItem info = new JMenuItem("Info");
									
			//Hauptmenupunkte Aufnehmen
			menubar.add(file);
			menubar.add(help);
			
			//Untermenupunkte von File Aufnehmen
			file.add(character);
			file.add(save);
			file.add(restore);
			file.addSeparator();
			file.add(quit);
			
			//Untermenupunkt von Help Aufnehmen
			help.add(info);
			
			//Shortcuts
			character.setAccelerator(KeyStroke.getKeyStroke('A', InputEvent.CTRL_DOWN_MASK ));
			save.setAccelerator(KeyStroke.getKeyStroke('S', InputEvent.CTRL_DOWN_MASK ));
			restore.setAccelerator(KeyStroke.getKeyStroke('R', InputEvent.CTRL_DOWN_MASK ));
			quit.setAccelerator(KeyStroke.getKeyStroke('Q', InputEvent.CTRL_DOWN_MASK ));
			info.setAccelerator(KeyStroke.getKeyStroke('I',InputEvent.CTRL_DOWN_MASK));

			// Layout
			setLayout(new BorderLayout());
			add(menubar,BorderLayout.NORTH);
					
		}
		
	}
	
	public static void main(String[] args) {
		new MainWindow("Jayton Dowerty's Eve-Online Tool 1.0").setVisible(true);
	}
}
 
Zuletzt bearbeitet:
Edit: Ich schreibe zu langsam^^. Ich lass es trotzdem mal stehen.
Zu 1.
Mnemonics helfen dir, damit du per Tastatur schnell in den Menüs navigieren kannst. Aber um Quit per Tastendruck 'q' auszulösen musst du erst ins Filemenü wechseln.
Um die Menüeinträge von überall aufrufen zu können musst du Beschleunigertasten (accelators) setzen. Die Beschleunigertasten stehen dann auch hinter dem Menüeintrag, also die Tastenkombination.
Java:
corporation.setAccelerator(KeyStroke.getKeyStroke('C',Event.CTRL_MASK));
z.B. Weiter gibts ALT_MASK und SHIFT_MASK. Die Werte kannst du einfach zusammenaddieren wenn du willst dass Shift und CTRL gedrückt werden müssen oder so.

zu 2.
Wie ist das zu verstehen?
Ob du das so machen willst, dass die Klasse den ActionListener implementiert (bzw. eine andere Klasse) und dann in der Klasse actionPerformed hast und immer abfragst, welches Menüitem ausgewählt wurde?
Java:
file.add(quit);
quit.addActionListener(this);
...
@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == quit) {
        System.exit(0);
    }
}

oder ob du eine anonyme Klasse machen sollst?
Java:
file.addActionListener(new ActionListener() {
	@Override
	public void actionPerformed(ActionEvent e) {
		System.exit(0);
	}
});

Es gibt noch weitere Methoden. Aber was du letztendlich brauchst, ist dir überlassen. bei kleineren Programmen ist es eigentlich egal welche der beiden oben genannten Methoden du brauchst.
 
Zuletzt bearbeitet:
hmm naja das programm bleibt erstmal einigermaßen klein
aber wird mit der zeit groß werden ^^
werd ich aus dem programm mit der zeit immer mehr machen möchte.
naja ich würd gern quasi das machen was am besten "wiederverwendbar" ist =)

PS bei deinem letztern vorschlag...
woher soll das programm wissen das ich gerade auf quit getippt habe wenn man

Java:
 file.addActionListener(new ActionListener() {
usw macht?

du meinstest eher quit.addActionListener oder? =)


andere Frage:
Wenn ich nun weitere fenster einfügen möchte,
ist es (erfahrungsgemäß) besser wenn ich den code in eine neue datei mache,
oder kann ich es einfach in die gleiche seite packen?

##EDIT##

ok ich hab mir jetzt eine dialogbox:

Code:
	public static class QuitWindow extends JDialog {
		public QuitWindow(final String title) {

			super(title);
			setSize(300,100);
			setLayout(new BorderLayout());
			//Buttons erzeugen
			final  JButton ja = new JButton("Ja");
			final  JButton nein = new JButton("Nein");
			final  JLabel text = new JLabel("Do you want to Quit?");
			//Button aufnehmen
			add(ja,BorderLayout.SOUTH);
			add(nein,BorderLayout.SOUTH);
			add(text,BorderLayout.NORTH);
			
			ja.addActionListener(new ActionListener(){
				@Override
				public void actionPerformed(ActionEvent e) {
					System.exit(0);
				}}
			);
			
		}

gebastelt die mit:

Code:
			quit.addActionListener(new ActionListener(){
				@Override
				public void actionPerformed(ActionEvent e) {
					new QuitWindow("Do you really want to Quit?").setVisible(true);
				}}
			);

aufgerufen wird in MainWindow...

Die Frage ist:
Wie bekomme ich es hin das beim drücken auf "X" das Fenster auch erscheint?

Und ich bekomme die fehlermeldung bei "super(title);"
die Fehlermeldung

Multiple markers at this line
- The constructor JDialog(String) is undefined
- Line breakpoint:WalletTool$QuitWindow [line: 12] - QuitWindow
(String)
 
ok ich bin nun um einiges weiter aber habe wieder son "harten brocken" ;)

folgender code:

Code:
package WalletTool;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class WalletTool {
	// Schließen Dialog
	
	@SuppressWarnings("serial")
	public static class QuitWindow extends JDialog {
		
		public QuitWindow(final String title) {
			
			// Feste Werte des Dialogs setzen
			setTitle(title);
			setLocationRelativeTo(null);
			setSize(185,110);
			setLayout(null);
			setResizable(false);
			
			//Buttons erzeugen
			final  JLabel text = new JLabel("Do you really want to Quit?");
			final  JButton yes = new JButton("Yes");
			final  JButton no = new JButton("No");
			
			// Layout
			text.setBounds(15,10,150,20);
			yes.setBounds(10,40,75,30);
			no.setBounds(90,40,75,30);
			
			//Button aufnehmen
	        add(text);
			add(yes);
			add(no);
			
			// ActionListener Ja Button
			yes.addActionListener(new ActionListener(){
				@Override
				public void actionPerformed(final ActionEvent e) {
					System.exit(0);
				}}
			);
			//ActionListener Nein Button
			no.addActionListener(new ActionListener(){
				@Override
				public void actionPerformed(final ActionEvent e) {
					dispose();
				}}
			);
			
		}

	
	}
	
	// Hauptfenster
	public static class MainWindow extends JFrame {
		private static final long serialVersionUID = 3595405672999869797L;
		int xwindowpos,ywindowpos;
		
		   public int centerWindow(int xwindowpos , int ywindowpos) {
			   
		        Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); 
		        xwindowpos = (d.width - getSize().width) / 2; 
		        ywindowpos = (d.height - getSize().height) / 2;
		        return (xwindowpos+ywindowpos);
		    }
		   
		//Konstruktor MainWindow
		public MainWindow(final String title) {
			super(title);
			// Konstante Werte des Gesamten Fensters
			
			setPosition(xwindowpos,ywindowpos);
			setSize(800,600);
			// Standart CloseOperation Löschen bzw. auf Nichts tun setzen.
			setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
			// Den neuen WindowListener setzen.
			addWindowListener(
					new WindowAdapter() {
						@Override
						public void windowClosing(WindowEvent e) {
							new QuitWindow("Do you really want to Quit?").setVisible(true);
						}
					}
			);
			
			// Menubar Erzeugen
			final JMenuBar menubar = new JMenuBar();
			
			// Menupunkte Erzeugen
			final JMenu file = new JMenu("File");
			final JMenu help = new JMenu("Help");
			
			// Untermenupunkte File Anlegen
			final JMenuItem character = new JMenuItem("Add Charakter");
			final JMenuItem save = new JMenuItem("Save Settings");
			final JMenuItem restore = new JMenuItem("Restore Settings");
			final JMenuItem quit = new JMenuItem("Quit");
			
			//Untermenupunkte Help Anlegen
			final JMenuItem info = new JMenuItem("Info");
									
			//Hauptmenupunkte Aufnehmen
			menubar.add(file);
			menubar.add(help);
			
			//Untermenupunkte von File Aufnehmen
			file.add(character);
			file.add(save);
			file.add(restore);
			file.addSeparator();
			file.add(quit);
			
			//Untermenupunkt von Help Aufnehmen
			help.add(info);
			
			//Shortcuts
			character.setAccelerator(KeyStroke.getKeyStroke('A', InputEvent.CTRL_DOWN_MASK ));
			save.setAccelerator(KeyStroke.getKeyStroke('S', InputEvent.CTRL_DOWN_MASK ));
			restore.setAccelerator(KeyStroke.getKeyStroke('R', InputEvent.CTRL_DOWN_MASK ));
			quit.setAccelerator(KeyStroke.getKeyStroke('Q', InputEvent.CTRL_DOWN_MASK ));
			info.setAccelerator(KeyStroke.getKeyStroke('I',InputEvent.CTRL_DOWN_MASK));

			// Layout
			setLayout(new BorderLayout());
			add(menubar,BorderLayout.NORTH);
			// Die Listener			
			quit.addActionListener(new ActionListener(){
				@Override
				public void actionPerformed(ActionEvent e) {
					new QuitWindow("Quit").setVisible(true);
				}}
			);
			
		}
		
	}
	
	public static void main(String[] args) {
		new MainWindow("Jayton Dowerty's Eve-Online Tool 1.0").setVisible(true);
	}
}

bei:

Code:
setPosition(xwindowpos,ywindowpos);

bekomme ich die Fehlermeldung:

The method setPosition(int, int) is undefined for the type WalletTool.MainWindow

Warum?

die beiden variablen sind existent und die methode müßte auch einen wert zurück geben... !
 
PS bei deinem letztern vorschlag...
woher soll das programm wissen das ich gerade auf quit getippt habe wenn man

Java:
 file.addActionListener(new ActionListener() {
usw macht?

du meinstest eher quit.addActionListener oder? =)
Ja sollte natürlich quit sein ;).

Ich sehe in deiner Klasse MainWindow keine Methode setPosition(int, int). Und auch von JFrame oder einer übergeordneten Klasse wird die Methode nicht geerbt.
Um das Fenster auf dem Bildschirm zu positionieren/platzieren kannst du
Java:
public void setLocation(int x, int y)
benutzen
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Component.html#setLocation(int, int)
 
Zuletzt bearbeitet:
Zurück