# GUI-Hilfe für Anfänger



## kevin1891 (19. Nov 2009)

Hallo,

bin noch sehr "neu" in der Welt des Java-Programmierens und möchte hier um Hilfe bitten. 
Ich habe folgendes Programm geschrieben ( das Programm berechnet den Durchschnitt von vier eingegebenen Zahlen und gibt den Wert anschließend aus. ) und wollte nun, dass das Programm Grafisch ( also als Fenster ) angezeigt wird. Das heißt, ich möchte, dass sich nach dem öffnen der .class Datei ein Fenster mit Buttons öffnet...

habe schon hunderte tutorials angeschaut, konnte sie aber leider nicht ganz auf mein Programm umsetzen...

Und hier der Source Code:


```
import java.util.Scanner;

class Durchschnitt{
  public static void main(String[] args){

    System.out.println("Geben Sie vier Zahlen ein und bestätigen Sie jede mit ENTER ");
    Scanner input = new Scanner(System.in);
    double total = 0;
    double grade;
    double average;
    double counter = 0;
    
    while (counter < 4){
      grade = input.nextInt();
      total = total + grade;
      counter++;
    }
    average = total/4;
    System.out.println("Der Duchschnitt dieser vier Zahlen ist: "+ average);
  }
}
```


----------



## javimka (19. Nov 2009)

Meinst du, dass alles, was du über System.out ausgibst statt auf der Konsole in einem Fenster ausgegeben werden soll?

Also zumindest ein Fenster kannst du jedenfalls relativ einfach erstellen:

```
JFrame frame = new JFrame("Mein Fenster");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
```

Dem Frame müsstest du dann noch die nötigen Komponenten anfügen, die dann anzeigen, was du angezeigt haben willst 

//EDIT: Theoretisch sollte das Frame im Event-Dispatching-Thread erzeugt werden. Aber das erklär ich dir später, versuch einfach mal den Code oben einzufügen und dann solltest du ein Fenster haben.


----------



## Bartleby (19. Nov 2009)

Na das kann ich nicht ganz glauben, dass du scho hunderte Tutorials gelesen hast... In deinem Programm ist ja absolut nichts davon zu sehen... Vielleicht solltest du noch mal nach dem Stichwort "Swing" suchen.


----------



## kevin1891 (19. Nov 2009)

Genau das meine ich! Ich möchte das gesamte Programm als Fenster ausführen!

Und wo genau muss ich diesen obigen Text in den Source Code einfügen? 

Danke


----------



## kevin1891 (19. Nov 2009)

javimka hat gesagt.:


> Meinst du, dass alles, was du über System.out ausgibst statt auf der Konsole in einem Fenster ausgegeben werden soll?
> 
> Also zumindest ein Fenster kannst du jedenfalls relativ einfach erstellen:
> 
> ...




OK das Fenster habe ich jetzt......wie bekomme ich jetzt das Programm ins Fenster? Weil das Fenster ist bis jetzt leer.... :/


----------



## javimka (19. Nov 2009)

Ich habe mal ein Beispiel Programm gemacht, das auf sehr einfach Weise fast das machst, was du willst:

```
import javax.swing.JEditorPane;
import javax.swing.JFrame;

public class Konsole extends JFrame {

	private JEditorPane editor;
	
	public Konsole() {
		super("Konsole");
		editor = new JEditorPane();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		add(editor);
		setSize(300,200);
		setLocationRelativeTo(null);
		setVisible(true);
	}
	
	public void print(String text) {
		editor.setText(editor.getText()+text);
	}
	
	public void println(String text) {
		editor.setText(editor.getText()+text+"\n");
	}
	
	
	public static void main(String[] args) {
		Konsole konsole = new Konsole();
		konsole.print("Huhu ");
		konsole.println("2 * 2 = "+4);
		konsole.println("das ist "+true);
	}
}
```

Statt über System.out.println Texte auszugeben, gibst du sie hier einfach über konsole.print bzw. konsole.println aus. Um meine Klasse zu nutzen instanzierst du am Anfang von DEINEM main einfach [c]Konsole konsole = new Konsole();[/c] und ersetzt dann alle System.println(...) durch konsole.println(...).
Hoffe, es hilft.


----------



## kevin1891 (19. Nov 2009)

Gut,

klingt logisch, danke! 

Eine letzte Frage noch: Das mit dem instanzieren....wo GENAU muss ich "Konsole konsole = new Konsole();" im meinem Programm einfügen? Sorry, bin ein nOOOb


----------



## javimka (19. Nov 2009)

Das musst du vor deinem ersten System.out.println Aufruf machen, weil du ja dann die konsole anstelle des System.out.println brauchst. Also am besten als allerersten Befehl in der main-Methode.


----------



## kevin1891 (19. Nov 2009)

so jetzt habe ich diese "Konsole konsole = new Konsole();" eingefügt und "konsole.println" auch....

jetzt erscheint ein fenster mit meinem Text aber ich kann nichts eingeben das ich dann auch bestätigen kann.......also ist irgendwas mit dem Scanner nicht korrekt.......?


----------



## javimka (19. Nov 2009)

Dein Scanner funktioniert schon korrekt, aber ich dachte, du wolltest nur den Output im Fenster anzeigen. Um da auch Inputs einzufügen müsstest du ziemlich was rumflicken. Einfacher würde es so gehen, wenn du unter die EditorPane ein JTextfied einfügst, wo dann die Inputs eingegeben werden. Dieser TextField müsstest du dann einen ActionListener anhängen, der die Eingaben dann dem Programm übergibt. Für diese Aufgabe musst du aber noch so einiges nachlesen.


----------



## javimka (20. Nov 2009)

Dein Programm ist eigentlich so einfach, dass sich eine GUI dafür auch einfacher realisieren lässt:

```
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;

import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class MyGUI extends JFrame {

	public MyGUI() {
		super("MyGUI");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		final int n = 4;
		final JLabel lblResult = new JLabel("Resultat: ");
		lblResult.setAlignmentX(LEFT_ALIGNMENT);
		
		JPanel pnlFields = new JPanel(new GridLayout(1,n,5,0));
		pnlFields.setBorder(new EmptyBorder(5,0,5,0));
		
		final JFormattedTextField[] txfs = new JFormattedTextField[n];
		KeyAdapter kl = new KeyAdapter() {
			@Override
			public void keyReleased(KeyEvent event) {
				int sum = 0;
				for (int i=0;i<n;i++) {
					try {
						sum += Integer.parseInt(txfs[i].getText());
					} catch (NumberFormatException e) {} // keine Zahl im Feld
				}
				lblResult.setText("Resultat = "+sum/n);
			}
		};
		
		for (int i=0;i<n;i++) {
			txfs[i] = new JFormattedTextField(new DecimalFormat("0"));
			txfs[i].setText("0");
			txfs[i].addKeyListener(kl);
			pnlFields.add(txfs[i]);
		}
		
		pnlFields.setAlignmentX(LEFT_ALIGNMENT);
		pnlFields.setMaximumSize(new Dimension(
				Integer.MAX_VALUE,
				pnlFields.getPreferredSize().height ));
		
		JPanel pnl = new JPanel();
		pnl.setLayout(new BoxLayout(pnl,BoxLayout.Y_AXIS));
		pnl.add(new JLabel("Geben Sie "+n+" zahlen ein",JLabel.LEFT));
		pnl.add(pnlFields);
		pnl.add(lblResult);
		pnl.add(Box.createVerticalGlue());
		pnl.setBorder(new EmptyBorder(10,10,10,10));
		
		add(pnl);
		pack();
		setLocationRelativeTo(null);
	}
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new MyGUI().setVisible(true);
			}
		});
	}
}
```


----------



## kevin1891 (20. Nov 2009)

Heh ok vielen Dank Javimka........ich sehe Java ist doch ziemlich ne komplexe Sache 

kannst du mir vielleicht sagen wo und wie DU Java so gut gelernt hast?! Gibt es da vllt ne gute Internetseite, gute Tutorials?

oder hast du Java während des Studierens gelernt?

Grüße


----------



## Gast2 (20. Nov 2009)

Trail: Creating a GUI With JFC/Swing (The Java™ Tutorials)

Fang mit 1 und 3 an 

Swing-Komponenten


----------



## Scrimau (22. Nov 2009)

kevin1891 hat gesagt.:


> ich sehe Java ist doch ziemlich ne komplexe Sache
> Grüße



So komplex ist es nicht, mit einem GUI-Builder oder einer guten Worksuite (kann NetBeans nur empfehlen) geht das auch viel einfacher, dann ziehste die Komponenten einfach auf ein JFrame und dann musst du das nicht alles per Hand eingeben sondern kannst dich dem Quelltext zuwenden.


----------



## hdi (22. Nov 2009)

> GUI-Builder oder einer guten Worksuite (kann NetBeans nur empfehlen) geht das auch viel einfacher


einfacher heisst in dem Fall: Man lernt nix über die Komponenten, Layouts usw.


> sondern kannst dich dem Quelltext zuwenden.


Das ist auch so ne Sache, der generierte Quelltext ist der letzte Rotz. Ich finde solche Tools kann man zur Planung des GUI-Designs verwenden, aber niemals für einen Release. Da sollte man das schon selber programmieren, und spätestens dann muss man wissen wie das funzt.

Naja also um eine zweite Meinung einzustreuen: Finger weg von solchen Tools! Ich programmier seit fast 3 Jahren und hab sowas noch nie verwendet, und ich glaube das hat mir auch nicht geschadet.

Links für den Anfang:
How to Make Frames (Main Windows) (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
Using Layout Managers (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)

Und anonsten einfach hier Fragen


----------



## javimka (22. Nov 2009)

kevin1891 hat gesagt.:


> kannst du mir vielleicht sagen wo und wie DU Java so gut gelernt hast?!Grüße



Ich habe alles aus (online) Büchern gelernt. Handbuch der Java-Programmierung, 4. Auflage
Einen Monat lang habe ich jeden Tag daraus gelesen und mir die Befehle für all die Klassen auf einen Schreibblock geschrieben :lol: Im Nachhinein würde ich es wohl anders machen, aber damals hatte ich ja noch keine Ahnung von der Java API 

Dann habe ich klein angefangen Frames zusammenzubasteln und natürlich auch all die Anfängerfehler gemacht wie getGraphics aufzurufen, while-Schleifen in ActionListener zu stecken, MVC in nur einer Klasse zu programmieren usw. Nebenbei einfach viele weitere Bücher gelesen, z.B. "Java ist auch eine Insel", "Effective Java", "Filthy Rich Clients". Einen GUI-Builder habe ich nie verwendet.
Das erste Jahr habe ich auch nur in einem Texteditor programmiert, der gerade mal die Syntax hervorgehoben hat, aber compiliert und laufen lassen habe ich alles über die Konsole. Dadurch lernt man dann auch die einzelnen Methoden auswendig. Jetzt benutze ich Eclipse.

Ich programmiere jetzt seit etwas 2 Jahren mit Java und wenn du interessiert bist und bleibst, wirst du das alles auch bald können


----------

