Einige Fragen zum GUI

brasilian

Grünschnabel
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 ? :rolleyes:

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
 

Thomas Darimont

Erfahrenes Mitglied
Servus!

zu 1)

In Java gibt es sgnt. Inner Classes du kannst also folgendes machen:

Code:
public class Test {
   
   private InnerTest it = null;
   
   public Test(){
          it = new InnerTest();
   }

   ...

   class InnerTest{
       public InnerTest(){

       }

       ...
   }
}

damit könntest du eventuell 2 Klassen vermeiden.

2)

Eine Alternative für dich wäre z.Bsp. folgendes:

Erstelle ein JPanel und füge das dem JFrame hinzu,
dann besorgst du dir mit
Graphics gra = myJPanel.getGraphics();
eine Instanz der Klasse Graphics und kannst dann schön mit
gra.drawLine(x1,y1,x2,y2);
Linien aufs J´Panel Pinseln ...

3)

bei JFrame --->
heißt IMHO setLocation(int x, int y);

4)

Das wird etwas schwieriger:

Zum einen baust du dir dann einen Funktionsplotter, der dir den Graph zu dieser Funktion anmalt was eigentlich recht simpel zu machen ist, damit es jedoch so weit kommt, brauchst du erstmal einen schicken Formelparser, der die den eingegebenen String (Formel) in eine Anweisungsfolge zerlegt, mit der dein Computer arbeiten kann ... das ist nocht ganz Trivial und für den "Anfang" vielleicht ein wenig Oversized ... aber bei interesse kannst du dir mal
das hier: http://www.3plus4software.de/downloads/index.html#exprsr
ansehen ...

Ok bis dann Gruß Tom
 

brasilian

Grünschnabel
Du hast absolut Recht zu Punkt 4, dieser würde einen Anfänger wie ich es bin wohl ziemlich zusetzen.

Aber ich möchte halt gerne wissen, wie das "Prinzip" aufgebaut ist.

Mal angenommen, ich würde die Idee aus Punkt 4 deutlich vereinfachen.
Ich würde anstatt gleichwelche Funktion eine einfache Geradengleichung darstellen wollen.

Mathematische Form einer Geraden:

y = ax + b

So, um nun noch das Problem mit der Eingabe zu vereinfachen würde ich 2 Eingabefelder vorsehen, auch wenn das vom Layout nicht besondes aussieht.
Im ersten Eingabefeld wird der Wert von a bestimmt und im zweiten Eingabefeld würde der Benutzer den Wert von B eintragen dürfen.

Wie kann ich aber nun die beiden Parameter A und B meiner Grafik übergeben damit diese die richtige Grafik erstellen kann.

Also, es geht mir nicht darum wie ich Werte aus dem EIngabefeld einlesen kann, oder wie ich eine einfache Gerade mit festen Werten zeichnen kann.

Ich möchte nur wissen wie ich die beiden Parameter übergeben kann.

Quellcode:

- Datum: 09/10/2003
- Beschreibung: Dieses Programm soll eine einfache Gerade zeichen nach der
Eingabe der beiden Parameter a(x) und b(0-Element), wobei der
Einfacheit a und b aus den natürlichen Zahlen sind. */

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

public class Gerade extends JFrame
{
private JFrame frame;
private JPanel panel = new JPanel ();
private JTextField t1 = new JTextField(5);
private JTextField t2 = new JTextField(5);
private JButton draw = new JButton("Zeichne");
int a,b;
String text1,text2;

public static void main(String[] args)
{
Gerade myGerade = new Gerade();
myGerade.setVisible(true);
}
public Gerade()
{
JFrame frame = new JFrame("Graph einer Geraden");
setSize(250,250);
setTitle("Graph einer Geraden");
addWindowListener(new WindowAdapter()
{
public void WindowClosing(WindowEvent e)
{
System.exit(0);
}
});
getContentPane().add(panel);
panel.add(t1);
panel.add(t2);
panel.add(draw);

draw.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
dozeichne();
}
});
}
public void dozeichne()
{
text1 = t1.getText();
text2 = t2.getText();
a = Integer.parseInt(text1);
b = Integer.parseInt(text2);

// Hier geht mit die Luft aus...

}






Vielen Dank im Vorraus

Brasilian
 

Neue Beiträge