# Einige Fragen zum GUI



## brasilian (8. Okt 2003)

Hallo,

ich beschäfftige mich erst seit kurzem mit dem GUI.

Ich habe jedoch schon einge Fragen, auf denen ich einfach keine Antwort finden kann.

Ich möchte anhand eines simplen Buttons ("Zeichnen") ein neues Grafikfenster erstellen wo dann zum Beispiel ein einfaches Achsenkreuz dargestellt wird. Ich habe etwas rumgetüfftelt und bin zu einer Lösung gekommen. Ich habe zwei seperate Java-Dateien erstellt, einmal ein "Menu" mit dem Button und zum zweiten eine "Grafik" Achsenkreuz.

Hier mein Quellcode:

// Zuerst der Button

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

public class GraphTest extends JFrame
{
private JFrame frame;
private JPanel panel = new JPanel();
private JButton draw = new JButton("Zeichne");

public static void main(String[] args)
{
GraphTest myGraphTest = new GraphTest();
myGraphTest.setVisible(true);
}
public GraphTest()
{
JFrame frame = new JFrame ("GraphTest");
setSize(100,100);
addWindowListener(new WindowAdapter()
{
public void WindowClosing(WindowEvent e)
{
System.exit(0);
}
});
getContentPane().add(panel);
panel.add(draw);

draw.addActionListener(new ActionListener()
{

public void actionPerformed (ActionEvent evt)
{

dozeichen();
}
});

}
public void dozeichen()
{
JFrame frame = new JFrame ("Achsenkreuz");
frame.getContentPane().add(new Achsenkreuz());
frame.pack();
frame.setVisible(true);
}
}

// Nun das Achsenkreuz

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

public class Achsenkreuz extends JPanel
{
public static void main (String[] args)
{
JFrame frame = new JFrame ("Achsenkreuz");
frame.getContentPane().add(new Achsenkreuz());
frame.pack();
frame.setVisible(true);
}
public Achsenkreuz()
{
setBackground(Color.white);
setForeground(Color.black);
}
public void paintComponent(Graphics f)
{
super.paintComponent(f);
f.drawLine(20,250,520,250);
f.drawLine(250,20,250,520);
}
public Dimension getPreferredSize()
{
return new Dimension(540,540);
}
}



Schön und gut werdet ihr euch jetzt sicherlich denken, dass ganze funktioniert doch, was will der denn überhaupt ?  

1) Mich stört, dass ich 2 Dateien für meine Lösung benötigt habe, wie könnte man dies in einer einzigen Datei lösen ?

2) Jedes Mal wenn ich auf den Button "Zeichnen" klicke, dann bekommen ich ein neues Fenster erstellt. Wenn ich 10 mal drauf klicke hab ich also 10 Fenster. Ich möchte aber nur ein einziges Fenster haben (bin doch kein Glaser... ) und der Button "Zeichen" soll sozusagen das "alte" Fenster nur aktualisieren. Wie kann ich dies machen ?

3) Jedesmal wenn ein neues Fenster auf den Bildschirm erscheint, hab ich das ins linke obere Eck "kleben". Wie könnte ich im Quelltext schon festlegen, wo das Fenster "hingehört" ?.

4) Nach meinem Modell benutze ich ja 2 Dateinen. Ich könnte zum Beispiel ein Programm schreiben wo der Benutzer zwischen Kreis, Rechteck und Dreieck auswählen könnte. Ich müßte hierfür ja nur immer für jede geometrische Figur den entsprechenden Quelltext in einer eigenen Datei schreiben. Was aber passiert, wenn ich in einem Textfeld zum Beispiel eine math. Funktionsgleichung eingebe. Wie könnte ich hier die entsprechenden Parameter "verwalten".


So das sollte aber wirklich genung sein. 

Ich würde mich sehr freuen wenn ihr mir weiterhelfen könntet.

Vielen Dank

Brasilian


----------



## Stefan1200 (8. Okt 2003)

brasilian hat gesagt.:
			
		

> Hallo,
> 
> 1) Mich stört, dass ich 2 Dateien für meine Lösung benötigt habe, wie könnte man dies in einer einzigen Datei lösen ?
> 
> ...



Kleiner Tipp: Benutze für den Source Code die Code Funktion vom Forum, damit man es besser lesen kann.

1) Falls du nur den Source Code in einer Datei schreiben willst,
    dann schreib Ihn einfach in eine Datei ;-)
    Du musst dann halt das public vor public class Achsenkreuz extends JPanel 
    weg nehmen. Also nur class Achsenkreuz extends JPanel
    Falls du auch nur eine Klasse haben möchtest, schreib einfach Methoden.

2) Achsenkreuz zeichenFenster = new Achsenkreuz();
    Das machst du ganz oben rein, direkt unter public class GraphTest extends JFrame {

    Also so:

```
public class GraphTest extends JFrame 
{
    Achsenkreuz zeichenFenster = new Achsenkreuz();
    private JFrame frame;
    private JPanel panel = new JPanel();
    private JButton draw = new JButton("Zeichne");
```

    Deine dozeichen() Methode muss dann auch geändert werden:

```
public void dozeichen() 
{
    if (!zeichenFenster.isVisible())
    {
        JFrame frame = new JFrame ("Achsenkreuz");
        frame.getContentPane().add(zeichenFenster);
        frame.pack();
        frame.setVisible(true);
    }
}
```

3) Das machst du mit der setLocation Methode vom JFrame.
    Dieser werden dann zwei Werte, x und y Position als Integer übergeben.
    In meinem Beispiel unten übergebe ich 100 und 100 als Position.
    Deine dozeichen() Methode sieht dann so aus:

```
public void dozeichen() 
{
    if (!zeichenFenster.isVisible())
    {
        JFrame frame = new JFrame ("Achsenkreuz");
        frame.getContentPane().add(zeichenFenster);
        frame.pack();
        frame.setLocation(100,100);
        frame.setVisible(true);
    }
}
```

4) Diese Frage möchte bitte jemand anderes Beantworten,
    ich kann mir das gerade nicht richtig vorstellen.


----------



## brasilian (8. Okt 2003)

Erstmal vielen Dank für deine schnelle Antwort,

leider haben nicht alle deine Ratschläge Früchte getragen.

Positiv ist schonmal das mit setLocation(x,y); das Fenster jetzt überall verschieben kann.

Ich habe auch versucht die beiden Dateien in einer einzigen Datei zu vereinen => Leider ohne Erfolg.

Ich habe deine  Anweisungen  zu Punkt 1 befolgt, und bekam als Quitung direkt 2 Fehlermeldungen die sich wohl auf das *static* bezogen. Ich  habe anschließend das static gelöscht und konnte das Programm fehlerfrei kompilieren, doch beim Simulieren stellte ich dann fest, dass der Button "Zeichne" keine Funktion mehr hat.  

Der zweite Ratschlag, die Vermeidung von x-Fenstern hat auch nicht funktioniert. 

Trotzdem möchte ich mich nochmal für deine schnelle Hilfe und deinen Einsatz bedanken.

Gruß

Brasilian


----------



## Stefan1200 (8. Okt 2003)

brasilian hat gesagt.:
			
		

> Erstmal vielen Dank für deine schnelle Antwort,
> 
> leider haben nicht alle deine Ratschläge Früchte getragen.
> 
> ...




Hmm, du erstellst die Fenster ein bissel anders, als wie ich das mache. Aber deswegen muss das nicht besser sein, wie ich das mache. Ich habe ja auch erst vor 6 Monaten mit der Java Programmierung angefangen.

Dennoch bin ich erstaunt, das dein Fenster nicht mehr geht.

Aber auf jedenfall kannst du mit
if (deinJFrame.isVisible())
abfragen, ob das Fenster offen ist (deinJFrame ist mit der instanz variable auszutauschen, die auch setVisible(true) macht). Und wenn nicht, öffnest du es halt.


----------

