GUI Anfänge und verstehen

MiMa

Top Contributor
Hi,

ich versuche jetzt mal zu meinen mini Testprojekten jetzt mal nicht auf die Konsole aus zu geben, sondern mal eine einfache GUI auf zu bauen.

Ich hatte auch schon mal ein paar GUIs von Hand Programmiert in denen ich schon mal Variablen und Inhalte anzeigen lies, habe aber jetzt in diesem Beispiel den GUI Designer von Eclipse verwendet.

Es ist mit Absicht einfach gehalten um die verschiedenen Vorgehensweisen zu verstehen.

Das GUI:

Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JList;
import javax.swing.JTextField;

public class Hauptfenster extends JFrame
{

	private JPanel contentPane;
	private JTextField textField_log;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args)
	{
		EventQueue.invokeLater(new Runnable()
		{
			public void run()
			{
				try
				{
					Hauptfenster frame = new Hauptfenster();
					frame.setVisible(true);
				} catch (Exception e)
				{
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Hauptfenster()
	{
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 491);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JButton btnSchliessen = new JButton("schliessen");
		btnSchliessen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// Programmfenster schliessen
				System.exit(0);
			}
		});
		btnSchliessen.setBounds(327, 434, 117, 29);
		contentPane.add(btnSchliessen);
		
		JButton btnAusfuehren = new JButton("Ausf\u00FChren");
		btnAusfuehren.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			}
		});
		btnAusfuehren.setBounds(6, 434, 117, 29);
		contentPane.add(btnAusfuehren);
		
		JButton btnAdd = new JButton("+");
		btnAdd.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				// JFileChooser-Objekt erstellen
		        JFileChooser chooser = new JFileChooser();
		        // Dialog zum Oeffnen von Dateien anzeigen
		        int rueckgabeWert = chooser.showOpenDialog(null);
		        
		        /* Abfrage, ob auf "Öffnen" geklickt wurde */
		        if(rueckgabeWert == JFileChooser.APPROVE_OPTION)
		        {
		             // Ausgabe der ausgewaehlten Datei
		             System.out.println("Die zu öffnende Datei ist: " + chooser.getSelectedFile().getName());
		        }
				
			}
		});
		btnAdd.setBounds(6, 144, 40, 29);
		contentPane.add(btnAdd);
		
		JButton btnRemove = new JButton("-");
		btnRemove.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			}
		});
		btnRemove.setBounds(41, 144, 40, 29);
		contentPane.add(btnRemove);
		
		textField_log = new JTextField();
		textField_log.setBounds(6, 185, 438, 237);
		contentPane.add(textField_log);
		textField_log.setColumns(10);
		
		JList list_path = new JList();
		list_path.setBounds(6, 6, 438, 126);
		contentPane.add(list_path);
	}
}

Das Schliesssysmbol am oberen Fenster funktioniert.
Das obere Fenster sollen mehrere Verzeichnispfade enthalten, die beim Drücken von Ausführen irgendwas machen.
Mit dem Klick auf das Plus Zeichen öffnet sich ein Fenster, indem man Verzeichnisse auswählen sollen.
Aktuell öffnet sich ein JFileChooser, in dem man nur nach Dateien suchen kann.

Wie man das umbaut das es nur nach Verzeichnissen sucht habe ich bisher noch nicht heraus gefunden.

Beim Klick auf das Minus Symbol soll ein Verzeichnispfad wieder entfernt werden können.

Das untere Fenster sollen die Aktivitäten anzeigen, die ausgeführt werden, wie in der Konsole.

Die "schliessen" Schaltfläche funktioniert auch schon mal.

Also habe ich nun zwei Fragen:

1. Speichern der Verzeichnispfade.
Speichert man das in einer ArrayList, damit diese Flexibel ist ?

2. Wie muss es gespeichert werden, da es bei Programmende und beim Neustart erhalten bleiben soll.

Ich denke, das obere Fenster muss vielleicht eine JList sein und das untere ein Textfenster.

Bedanke mich für Eure Vorschläge.

Mi
 

MiMa

Top Contributor
Man speichert die Pfade in einem String jeweils. :)

Ja Danke,
aber wie werden die denn gespeichert, wenn das Programm beendet wurde und wie werden die wieder geladen, wenn das Programm erneut geladen wurde.


Das auswählen von Verzeichnissen im FileChooser habe ich gelöst, indem ich folgende Zeile vor dem Öffnen eingefügt habe.

Java:
// FileChosser kann nur Verzeichnisse auswählen
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

Mi
 

MiMa

Top Contributor
Danke,

ich werde das mal mit der Preferences API versuchen um Platformunabhängig zu sein, damit es auch bei mir auf dem Mac funktioniert.

Im Moment bin ich noch dabei die Array Liste in die das JList Gui zu bekommen.

Mi
 

MiMa

Top Contributor
Ich habe nun die Auswahl für ein Verzeichnis hin bekommen, aber wenn ich das Ergebnis über die Konsole ausgeben lasse, dann erhalte ich nicht das deutsche Verzeichnis (Dokumente) sondern (Dokuments). ????

Klasse ArrayListe:

Java:
import java.util.ArrayList;

public class Daten
{
	// Instanzvariablen
	private ArrayList<String> pfadListe = new ArrayList<String>();
	
	
	// Verzeichnis hinzufügen
	public void addPfad(String verzeichnis)
	{
		pfadListe.add(verzeichnis);
	}
	
	// Anzahl der Verzeichnisse zurückgeben
	public int getPfadAnzahl()
	{
		return pfadListe.size();
	}
	
	// Verzeichnis an Stelle i zurückgeben
	public String getPfad(int i)
	{
		return pfadListe.get(i);
	}
	
	// Verzeichnis an Stelle i löschen
	public void removePfad(int i)
	{
		pfadListe.remove(i);
	}
}

Klasse Hauptprogramm:

Java:
import java.awt.EventQueue;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JList;
import de.michaelmadej.klasse.Daten;
import java.awt.event.ContainerAdapter;
import java.awt.event.ContainerEvent;

public class Hauptfenster extends JFrame
{

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args)
	{
		
		
		EventQueue.invokeLater(new Runnable()
		{
			public void run()
			{
				try
				{
					Hauptfenster frame = new Hauptfenster();
					frame.setVisible(true);
				} catch (Exception e)
				{
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Hauptfenster()
	{
		// Objekte erzeugen
		final Daten verzeichnis = new Daten();
				
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 491);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JButton btnSchliessen = new JButton("schliessen");
		btnSchliessen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// Programmfenster schliessen
				System.exit(0);
			}
		});
		btnSchliessen.setBounds(327, 434, 117, 29);
		contentPane.add(btnSchliessen);
		
		JButton btnAusfuehren = new JButton("Ausf\u00FChren");
		btnAusfuehren.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			}
		});
		btnAusfuehren.setBounds(6, 434, 117, 29);
		contentPane.add(btnAusfuehren);
		
		JButton btnAdd = new JButton("+");
		btnAdd.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				// JFileChooser-Objekt erstellen
		        JFileChooser chooser = new JFileChooser();
		        // FileChosser kann nur Verzeichnisse auswählen
		        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		        // Dialog zum Oeffnen von Dateien anzeigen
		        int rueckgabeWert = chooser.showOpenDialog(null);
		        
		        /* Abfrage, ob auf "Öffnen" geklickt wurde */
		        if(rueckgabeWert == JFileChooser.APPROVE_OPTION)
		        {
		             // Ausgewählten Verzeichnispfad in die ArrayListe speichern
		             verzeichnis.addPfad(chooser.getSelectedFile().getName());
		             
		             // Liste Ausgeben
		             for (int i = 0; i < verzeichnis.getPfadAnzahl(); i++)
		             {
		            	 System.out.println("Die zu öffnende Datei ist: " + verzeichnis.getPfad(i));
		             }
		        }
			}
		});
		btnAdd.setBounds(6, 200, 40, 29);
		contentPane.add(btnAdd);
		
		JButton btnRemove = new JButton("-");
		btnRemove.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			}
		});
		btnRemove.setBounds(40, 200, 40, 29);
		contentPane.add(btnRemove);
		
		JList list_path = new JList();
		list_path.setBounds(6, 6, 438, 182);
		contentPane.add(list_path);
	}
}

Ausserdem bereitet es mir noch Schwierigkeiten das gewählte Verzeichnis in der JList an zu zeigen. :rtfm:

Für Hilfe wäre ich dankbar.

Mi
 

mla.rue

Bekanntes Mitglied
unter Windows haben die Verzeichnisse englische Bezeichnungen... sie werden in der lokalisierten Version lediglich "maskiert"

Fürs System heisst es also user... documents.... aber angezeigt wird: Benutzer... Dokumente
Im Klartext: überden FileChooser siehst du Benutzer/blabla/Dokumente und wählst das Verzeichnis aus, im String landet aber user/blabla/documents

Um deine Zeichenketten in die JList zu kriegen, benutzt du z.B. einen javax.swing.DefaultListModel
 

Ähnliche Java Themen

Neue Themen


Oben