Organisation von Quellcode

Status
Nicht offen für weitere Antworten.

padde479

Bekanntes Mitglied
Hallo zusammen!

Ich bin gerade dabei, eine Anwendung zu schreiben. Da dies meine erste größere Java-Applikation ist, habe ich eine Frage zur Organisation der Quellcode-Dateien. Bisher habe ich eine Fenster mit einer Menüzeile und zwei kleinen Menüs. Ich habe auch schon ein paar Menüeinträge erzeugt und diese mit kleinen Funktionen belegt. Aber ist es nicht sinnvoller, gewisse Funktionen auszulagern? Bisher geschieht alles in einer Klasse Main. Wie ist es denn sinnvoll, das Projekt in einzelne Klassen zu organisieren? Könnt ihr mir da Tipps geben?

Hier erst einmal der bisherige Quellcode.

Code:
/**
 * Main.java
 */
package jile.gui;

import java.awt.Dimension;
import java.awt.Event;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PrinterJob;

import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

/**
 * Die Hauptklasse der Anwendung.
 * 
 * @author PHA
 * @version 0.0.1
 */
public class Main extends JFrame {
	public static final long serialVersionUID = System.currentTimeMillis();
	
	private JFrame    frame;
	private JMenuBar  menubar = new JMenuBar();
	private JMenuItem item;
	
	
	
	public Main() {
		frame = new JFrame("Jile");
		
		menubar.add(createFileMenu());
		menubar.add(createHelpMenu());
		frame.setJMenuBar(menubar);
		
		// Schließmechanismus einbauen
		frame.addWindowListener(new WindowClosingAdapter(true));		
		// Dimension des Fensters festlegen
		Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
		int width = screen.width; int height = screen.height;
		frame.setSize(width, height);
		frame.setVisible(true);
	}
	
	private JMenu createFileMenu() {
		JMenu file = new JMenu("File");
		file.setMnemonic('F');
		item = new JMenuItem("New", 'N');
		setCTRLAccelerator(item, 'N');
		item.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				new AboutDialog();
			}
		});
		file.add(item);
		file.addSeparator();
		item = new JMenuItem("Open", 'O');
		setCTRLAccelerator(item, 'O');
		item.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				JFileChooser chooser = new JFileChooser();
				chooser.showOpenDialog(frame);
			}
		});
		file.add(item);
		file.addSeparator();
		item = new JMenuItem("Print", 'P');
		setCTRLAccelerator(item, 'P');
		item.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				PrinterJob job    = PrinterJob.getPrinterJob();
				if (job.printDialog()) {
					try {
						job.print();
					} catch (Exception ex) {
						ex.printStackTrace();
					}
				}
			}
		});
		file.add(item);
		file.addSeparator();
		item = new JMenuItem("Quit", 'Q');
		setCTRLAccelerator(item, 'Q');
		item.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				System.exit(0);
			}
		});
		file.add(item);
		return file;
	}
	
	private JMenu createHelpMenu() {
		JMenu help = new JMenu("Help");
		help.setMnemonic('H');
		item = new JMenuItem("About Jile", 'A');
		setCTRLAccelerator(item, 'A');
		item.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				String msg = "Jile\n";
				ImageIcon imageIcon = new ImageIcon("U:\\swmslogo.bmp");
				JOptionPane.showMessageDialog(frame, msg, "About Jile", JOptionPane.INFORMATION_MESSAGE, imageIcon);
			}
		});
		help.add(item);
		return help;
	}
	
	private void setCTRLAccelerator(JMenuItem item, char accelerator) {
		KeyStroke keyStroke = KeyStroke.getKeyStroke(accelerator, Event.CTRL_MASK);
		item.setAccelerator(keyStroke);
	}
	
	/**
	 * Die <code>main</code>-Methode zum Starten der Anwendung.
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main();
	}

}

Hier registrie ich ja für jeden Menüeintrag einen eigenen ActionListener. Und kann ich die Menüs nicht besser in eigene Klassen auslagern, damit alles übersichtlicher wird und Änderungen leichter zu tätigen sind?

Gruß
Padde

PS: Wieso bekomme ich im JOption-Dialog eigentlich kein Bild angezeigt, obwohl es an genau dieser Position im Dateisystem zu finden ist?
 

Campino

Top Contributor
In mehrere Klassen zu zerlegen ist in jedem Fall sinnvoll. Für jedes JMenuItem eine eigene Klasse zu schreiben ist ein bisschen mit wie Kanonen auf Spatzen schießen, aber zerlegen ist schon sinnvoll. Dabei würde ich z.B. in den ActionListenern, die du an die JMenuItems hängst jeweils nur eine Methode aufrufen und in der dann alles andere machen. Eventuell kannst du diese Methoden alle in eine andere Klasse auslagern.
 

padde479

Bekanntes Mitglied
Und wie stell' ich das am besten an? Kannst Du mir vielleicht ein Beispielprojekt geben, an dem man eine solche Vorgehensweise sehen kann? Ich habe echt keine Idee, wie dass von statten gehen soll. In Tutorials etc. sieht man ja immer nur, wie man eine bestimmte Komponente verwendet, wie man aber mehrere Komponenten sinnvoll über mehrere Klassen miteinander verbindet, sucht man vergebens.

Gruß
Padde
 
S

SlaterB

Gast
da gibts auch kein Standard-Vorgehen,

in deinem Fall könntest du eine Klasse FileMenu erstellen und den Inhalt von
private JMenu createFileMenu() {
}
komplett in den Konstruktor der neuen Klasse verschieben,
schon hast du ein Dritter der Klasse ausgelagert

falls das FileMenü irgendwie mit dem HauptFrame zusammenarbeiten soll (z.B. in irgendeinem TextFeld was setzen),
dann muss das HauptFrame in Konstruktor als Paramter übergeben und im FileMenü as Exemplarvariable gespeichert werden

Falls deine ActionListener irgendwann mal größer werden, bietet es sich an eine Logikklasse zu haben.
Das FileMenü bekommt dann ein Objekt der Logikklasse als Exemplarvariable, und die ActionListener ein übersichtliches Aussehen,
z.B.

Code:
item = new JMenuItem("Print", 'P'); 
      setCTRLAccelerator(item, 'P'); 
      item.addActionListener(new ActionListener() { 
         public void actionPerformed(ActionEvent event) { 
            logik.print();
         } 
      });
 

Campino

Top Contributor
SlaterB: Eine FileMenu-Klasse halte ich für nicht optimal, da sie nicht wiederverwertbar ist und nur einmal gebraucht wird, aber eine einzig richtige Lösung gibt es nicht. Ich würde das so machen:

Code:
public class Fenster extends JFrame{
private Controller control;
private JButton knopf=new JButton("Klick mich");

public Fenster(Controller control){
this.control=control;

initGUI();
}

public void initGUI(){
//Fenstergröße usw. 
this.getContentPane().add(knopf);
knopf.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
control.drueckMich();
}
});
}
}
Code:
public class Controller{
private Fenster fenster;

public static void main(String args[]){
new Controller();
}

public Controller(){
fenster=new Fenster(this);
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Hier falls das mal an ein anderes Fenster soll, deshalb nicht in der Fensterklasse
fenster.setVisible(true);
}

publi void drueckMich(){
//Button-Kram, Zugriffe auf andere Componenten über getter/setter des Fenster-Objekts
}
}

(keine garantie für Funktionsfähigkeit/Compilierbarkeit, nur eben so runtergeschrieben)
 
G

Gast

Gast
Wie wäre es ein MVC-Pattern zu benutzen?
Damit kann schon mal vorsortiert werden in Modell, View und Controller. Dafür gibts schon mal ein paar tutorials.
Wenn es dann übersichtlicher geworden ist, wirds vielleicht auch einfacher mit der weiteren Umstrukturierung.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Organisation von Junit Testfällen? Allgemeine Java-Themen 2
R Organisation von Threads Allgemeine Java-Themen 4
S Verwendet Programmiersprache aus Quellcode - Datei ermitteln Allgemeine Java-Themen 6
C Quellcode-Übersetzung englisch zu deutsch Allgemeine Java-Themen 9
D Suche Quellcode! Allgemeine Java-Themen 8
B Quellcode einer Java libary finden um zu copy & paste'n Allgemeine Java-Themen 5
G Quellcode wiederherstellen Allgemeine Java-Themen 28
B Quellcode lesen - Aussortieren Allgemeine Java-Themen 3
M Quellcode von Java-Methoden Allgemeine Java-Themen 9
U Swing Hilfe beim Quellcode für ein Codierungs-/Decodierungsprogramm Allgemeine Java-Themen 9
G Externer Quellcode Allgemeine Java-Themen 3
L Methoden "Schiffe versenken" Quellcode in Methoden umwandeln Allgemeine Java-Themen 6
T Android Webview Webpage Quellcode to string Allgemeine Java-Themen 0
B Quellcode für Zwischenprüfung Allgemeine Java-Themen 4
M Aus Javaprogramm .NET Quellcode kompileren Allgemeine Java-Themen 2
J XML Dokument Zeilenumbruch in den Quellcode einfügen Allgemeine Java-Themen 5
T ExceptionHandling mit bescheidenem Quellcode Allgemeine Java-Themen 14
I Methoden Quellcode auslesen (Refelction o.ä.) Allgemeine Java-Themen 5
H Zeilenumbruch in Quellcode Allgemeine Java-Themen 4
G Eingegeben Formeln in Quellcode einbetten?! Allgemeine Java-Themen 4
E Compiler-Fehler wie muss ich die entstandene Quellcode kompilieren?? Allgemeine Java-Themen 2
T Api in Quellcode laden Allgemeine Java-Themen 8
L Java Quellcode auf Windows 7 ausführen? Allgemeine Java-Themen 3
S jsr in Quellcode Allgemeine Java-Themen 4
M R250 Quellcode Allgemeine Java-Themen 2
J Quellcode aus .jar auslesen? Allgemeine Java-Themen 3
M JLapack Quellcode beifügen? Allgemeine Java-Themen 4
P Probleme mit wikipedia quellcode zur binären Suche Allgemeine Java-Themen 6
X Quellcode von nativen Funktionen Allgemeine Java-Themen 2
D Übersetzen von Quellcode Allgemeine Java-Themen 11
N Java Quellcode zu Syntaxbaum Allgemeine Java-Themen 3
M Wie in Eclipse Quellcode incl. Zeilennummern kopieren? Allgemeine Java-Themen 6
G SourceForge - Quellcode Allgemeine Java-Themen 15
V Quellcode auf "Güte" testen? Allgemeine Java-Themen 5
C Java Quellcode parsen Allgemeine Java-Themen 8
M Quellcode DriverManager Allgemeine Java-Themen 2
C Fehler im Quellcode. Suche in einem Baum Allgemeine Java-Themen 3
G Problem mit Quellcode, Eingabe wird nicht angezeigt --HELP-- Allgemeine Java-Themen 2
T Problem mit Quellcode Allgemeine Java-Themen 2
D Was haltet ihr von meinem Quellcode - JConsole? Allgemeine Java-Themen 2
Lazybone Java Quellcode sichern Allgemeine Java-Themen 9
P Fehler im Quellcode Allgemeine Java-Themen 8
J Viel Text mit " im Quellcode abspeichern Allgemeine Java-Themen 7
R Copyright-Notiz am Anfang jeder Quellcode-Datei? Allgemeine Java-Themen 5
R Problem mit Quellcode Allgemeine Java-Themen 2
M Events im Quellcode auslösen Allgemeine Java-Themen 4
J Java Quellcode Aufbereitung für Dokumentation Allgemeine Java-Themen 11
F Quellcode von Java ansehen Allgemeine Java-Themen 4
S In einem HTML Quellcode gewünschten Abschnitt in Datei Save Allgemeine Java-Themen 9
R Java Quellcode zu exe Datei unsw. Allgemeine Java-Themen 5
G Quellcode inkludieren Allgemeine Java-Themen 3
J Quellcode aus JAVA Programmen Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben