Programmierstil / Wann eine neue Datei?

Status
Nicht offen für weitere Antworten.

Bernasconi

Mitglied
Hallo.

Ich habe meine kleinen ersten Schritte bezüglich grafischer Obefläche gemacht. Ich bin ziemlich schnell mit Java an sich zurecht gekommen. Allerdings sieht mein Code von der strukturierung wohl eher nicht wie javacode aus. Er läuft zwar einwandfrei, allerdings glaube ich, dass der Code anders organisiert sein sollte.

Konkret spreche ich von:
- mehr Klassen, als diese die ich verwendet habe
- aufteilung in mehrere files
- vielleicht andere zugriff auf die befehle
- vorallem: mehr Funktionen?

Bin mir jetzt nicht sicher, allerdings denke ich, dass mein Code ziemlich sequenziell aussieht und was ich über Java gelesen habe, sollte das eher nicht so sein.

Ich will jetzt nicht genau alles über meinen Code im kleinsten Detail wissen, nur eine grobe Einschätzung anhand meines Beispiels wie man den Code besser gestalten könnte.

Klar gibt es Bücher. Aber die sind für mich etwas zu allgemein gehalten. Wenn ich hier mein ersten Beispiel analysieren lasse, habe ich bestimmt fürs Leben mehr davon. Denn das ist mein Stil und nicht der, der das Buch schreibt.

Ich hoffe ihr könnt meine Situation verstehen und mir helfen. Dankeschön.

PS: Ich erwarte keine Aufsätze, wenn vielleicht jeder der Lust hat etwas erwähnen würde, dann hätte ich bei einigen Antworten sicherlich schon genügend davon. wer natürlich will, darf tagelang analysieren 😉



Code:
package cdverwaltung;

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

public class Hauptfenster 
{

	JFrame form;
	MenuDateiBeendenListener menuDateiBeendenListener = new MenuDateiBeendenListener();
	MenuDateiOeffnenListener menuDateiOeffnenListener = new MenuDateiOeffnenListener();
	MenuDateiSpeichernListener menuDateiSpeichernListener = new MenuDateiSpeichernListener();
	MenuInfoAboutListener menuInfoAboutListener = new MenuInfoAboutListener();
		
	public Hauptfenster() 
	{
		super();
		
		form = new JFrame("CD-Verwaltung - © 2007 Claudio Bernasconi" );
		form.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		form.setSize(800, 600);
		
		Toolkit toolkit = Toolkit.getDefaultToolkit();
	    Dimension d_aufloesung = toolkit.getScreenSize();
	    
	    form.setLocation( d_aufloesung.width / 2 - 400, d_aufloesung.height / 2 - 300 );

		//Menüeinträge DATEI
		JMenuItem menuDateiNeuerEintrag = new JMenuItem( "Neuer Eintrag...", new ImageIcon( getClass().getResource("icons/small/new.gif") ) );
		menuDateiNeuerEintrag.setAccelerator(KeyStroke.getKeyStroke('N',InputEvent.CTRL_MASK));
		JMenuItem menuDateiSuchen = new JMenuItem( "Suchen...", new ImageIcon( getClass().getResource("icons/small/find.gif") ) );
		menuDateiSuchen.setAccelerator(KeyStroke.getKeyStroke('F',InputEvent.CTRL_MASK));
		JMenuItem menuDateiOeffnen = new JMenuItem( "Öffnen...", new ImageIcon( getClass().getResource("icons/small/open.gif") ) );
		menuDateiOeffnen.setAccelerator(KeyStroke.getKeyStroke('O',InputEvent.CTRL_MASK));
		menuDateiOeffnen.addActionListener(menuDateiOeffnenListener);
		JMenuItem menuDateiSpeichern = new JMenuItem( "Speichern...", new ImageIcon( getClass().getResource("icons/small/save.gif") ) );
		menuDateiSpeichern.setAccelerator(KeyStroke.getKeyStroke('S',InputEvent.CTRL_MASK));
		menuDateiSpeichern.addActionListener(menuDateiSpeichernListener);
		JMenuItem menuDateiBeenden = new JMenuItem( "Beenden" );
		menuDateiBeenden.setAccelerator(KeyStroke.getKeyStroke('Q',InputEvent.CTRL_MASK));
		menuDateiBeenden.addActionListener(menuDateiBeendenListener);
		
		//Menüeinträge EINSTELLUNGEN
		JMenuItem menuEinstellungenNummern = new JMenuItem( "Nummern...", new ImageIcon( getClass().getResource("icons/small/nummern.gif") ) );
		menuEinstellungenNummern.setAccelerator(KeyStroke.getKeyStroke("F5"));
		JMenuItem menuEinstellungenBetriebssysteme = new JMenuItem( "Betriebssysteme...", new ImageIcon( getClass().getResource("icons/small/system.gif") ) );
		menuEinstellungenBetriebssysteme.setAccelerator(KeyStroke.getKeyStroke("F6"));
		JMenuItem menuEinstellungenSpielKategorien = new JMenuItem( "Spiel Kategorien...", new ImageIcon( getClass().getResource("icons/small/spiel.gif") ) );
		menuEinstellungenSpielKategorien.setAccelerator(KeyStroke.getKeyStroke("F7"));
		JMenuItem menuEinstellungenFilmarten = new JMenuItem( "Filmarten...", new ImageIcon( getClass().getResource("icons/small/film.gif") ) );
		menuEinstellungenFilmarten.setAccelerator(KeyStroke.getKeyStroke("F8"));
		JMenuItem menuEinstellungenMusikrichtungen = new JMenuItem( "Musikrichtungen...", new ImageIcon( getClass().getResource("icons/small/musik.gif") ) );
		menuEinstellungenMusikrichtungen.setAccelerator(KeyStroke.getKeyStroke("F9"));
		
		//Menüeinträge INFO
		JMenuItem menuInfoHilfe = new JMenuItem( "Hilfe...", new ImageIcon( getClass().getResource("icons/small/help.gif") ) );
		menuInfoHilfe.setAccelerator(KeyStroke.getKeyStroke("F1"));
		JMenuItem menuInfoAbout = new JMenuItem( "About...", new ImageIcon( getClass().getResource("icons/small/about.gif") ) );
		menuInfoAbout.addActionListener(menuInfoAboutListener);
		
		//Mennübar einrichten
		JMenuBar mbar = new JMenuBar();
		
		//Menü DATEI einrichten
		JMenu menuDatei = new JMenu( "Datei" );
		menuDatei.setMnemonic('D');
		menuDatei.add(menuDateiNeuerEintrag);
		menuDatei.add(menuDateiSuchen);
		menuDatei.addSeparator();	//Trennstrich
		menuDatei.add(menuDateiOeffnen);
		menuDatei.add(menuDateiSpeichern);
		menuDatei.addSeparator();	//Trennstrich
		menuDatei.add(menuDateiBeenden);
		mbar.add(menuDatei);
		
		//Menü EINSTELLUNGEN einrichten
		JMenu menuEinstellungen = new JMenu( "Einstellungen" );
		menuEinstellungen.setMnemonic('E');
		menuEinstellungen.add(menuEinstellungenNummern);
		menuEinstellungen.add(menuEinstellungenBetriebssysteme);
		menuEinstellungen.add(menuEinstellungenSpielKategorien);
		menuEinstellungen.add(menuEinstellungenFilmarten);
		menuEinstellungen.add(menuEinstellungenMusikrichtungen);
		mbar.add(menuEinstellungen);
		
		//Menü INFO einrichten
		JMenu menuInfo = new JMenu( "Info" );
		menuInfo.setMnemonic('I');
		menuInfo.add(menuInfoHilfe);
		menuInfo.add(menuInfoAbout);
		mbar.add(menuInfo);
		
		//Menü dem Fenster hinzufügen
		form.setJMenuBar( mbar );
		
		//Fenster sichtbar machen
		form.setVisible(true);
	}
	
	class MenuDateiBeendenListener implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
			System.exit(0);
		}
	}
	
	class MenuDateiOeffnenListener implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
			FileDialog fdialog = new FileDialog(form, "Öffnen", FileDialog.LOAD);
			fdialog.setDirectory("C:\\Programme\\CD-Verwaltung\\");
			fdialog.setLocation(50,50);
			fdialog.setVisible(true);

			//Directory und Datei die ausgewählt wurden
			System.out.print( fdialog.getDirectory() );
			System.out.println( fdialog.getFile() );
			
			if( fdialog.getFile() != null )
			{
				//Prozess eine Datei zu laden

				JOptionPane.showConfirmDialog(form, "Datei geladen.",
    					"Geladen", JOptionPane.CLOSED_OPTION, JOptionPane.INFORMATION_MESSAGE);			
			}
		}
	}
	
	class MenuDateiSpeichernListener implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
			FileDialog fdialog = new FileDialog(form, "Speichern", FileDialog.SAVE);
			fdialog.setDirectory("C:\\Programme\\CD-Verwaltung\\");		    
			fdialog.setVisible(true);

			//Directory und Datei die ausgewählt wurden
			System.out.print( fdialog.getDirectory() );
			System.out.println( fdialog.getFile() );
			
			if( fdialog.getFile() != null )
			{
				//Prozess eine Datei zu speichern
				
				JOptionPane.showConfirmDialog(form, "Datei gespeichert.",
    					"Gespeichert", JOptionPane.CLOSED_OPTION, JOptionPane.INFORMATION_MESSAGE);				
			}
		}
	}
	
	class MenuInfoAboutListener implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
			Toolkit toolkit = Toolkit.getDefaultToolkit();
		    Dimension d_aufloesung = toolkit.getScreenSize();
			
		    ClassLoader cldr = this.getClass().getClassLoader(); 
		    ImageIcon icon = new ImageIcon(cldr.getResource("cdverwaltung/logo.gif"));
		    JLabel about = new JLabel( "<html>

CD-Verwaltung v. 1.0
© 2007 Claudio Bernasconi
All rights reserved.</p></html>", icon, JLabel.LEFT );
			
		    JDialog dialog = new JDialog(form, "About CD-Verwaltung", true );
			dialog.setSize(250,120);
			dialog.setLayout( new FlowLayout() );
			dialog.setLocation( d_aufloesung.width / 2 - 125, d_aufloesung.height / 2 - 60 );
			dialog.getContentPane().add(about);
			dialog.setResizable(false);
			dialog.setVisible(true);
		}
	}

	public static void main(String[] args) 
	{
		try 
		{
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) 
        {
            e.printStackTrace();
        } 
        
		new Hauptfenster();
	}

}
 
Anonymous hat gesagt.:
naja so schlect find ich das gar nicht. wie du selber sagts: die actionlistener evt. je in eine separate datei und schau die doch mal das sun swing tutorial bezüglich threads an:

http://java.sun.com/docs/books/tutorial/uiswing/concurrency/initial.html
Danke dir für deine Antwort.
In wie fern meinst du das mit den Threads? Ich kenne die Vorzüge der Threadprogrammierung.
Denkst du, dass sich das einsetzen von Threads bereits für die GUI lohnt? Ich setzte sie bis jetzt immer nur bei langen Berechnungen > 2s oder so, ca. ein.

Die Frage die ich mir immer stelle, ist die Anzahl der Threads die ich erstellen soll, und wie ich die Aufgaben aufsplitten soll. Auf jedenfall werde ich mir das Tutorial anschauen, nur ist mir leider das Ziel dieses Tutorials im Bezug auf mein Programm hier (spezifisch) nicht bekannt. Bitte um Erklärung (und Nachsicht).
 
könnte mir jemand noch einen Tipp geben? Es kann doch nicht sein, dass ich als Java-Anfänger bereits perfekten Javacode schreibe, also so überheblich bin ich dann auch wieder nicht.
 
du hast doch schon lauter SubKlassen,
ob du die nun auslagerst oder nicht ist Geschmackssache

die anderen 100 Zeilen lassen sich kaum aufsplitten,
ich empfehle da noch eine kürzere Schreibweise, aus
Code:
JMenuItem menuDateiSpeichern = new JMenuItem( "Speichern...", new ImageIcon( getClass().getResource("icons/small/save.gif") ) ); 
menuDateiSpeichern.setAccelerator(KeyStroke.getKeyStroke('S',InputEvent.CTRL_MASK)); 
menuDateiSpeichern.addActionListener(menuDateiSpeichernListener); 
menuDatei.add(menuDateiSpeichern);
wird
Code:
createMenuItem(menuDatei. "Speichern...","icons/small/save.gif",
       KeyStroke.getKeyStroke('S',InputEvent.CTRL_MASK),menuDateiSpeichernListener);
oder gar
Code:
createMenuItem(menuDatei, "Speichern...","save", 'S',ctrl,menuDateiSpeichernListener);
wennn eine entsprechende Operation createMenuItem da ist

was übersichtlicher ist, ist wieder Geschmackssache
 
Du initialisierst die Listener bei der Deklaration, den Frame aber im Konstruktor -> das würde ich einheitlich machen.

Teilweise wird die Ansicht vertreten, dass Methoden nicht mehr Code umfassen sollten als auf eine (Bildschirm-)Seite passt - dazu müssten man den Konstruktor in verschiedene Methoden aufteilen; das ist aber sicher Ansichtssache.

Ich würde vielleicht für den Aufbau der Menüs eine Hilfsmethode vorsehen, so wie Slater das vorgeschlagen hat.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben