# Problem Zeichnen in einer Fensterhälfte



## TTrp40 (24. Jul 2011)

Hallo Leute,

ich hab jetzt schon länger in Foren und Online-Büchern geschaut, bin aber nicht fündig geworden. Ich hoffe, dass mir von euch jemand weiterhelfen kann. Bin ein wiedereinsteiger und kenne mich mit Java noch nicht richtig gut aus.

Folgendes Problem:
Ich möchte eine Java Applet programmieren, bei dem der User verschiedene Parameter eingeben kann, anschließend auf einen Button Drückt und es wird etwas berechnet und anschließend ein Diagramm gezeichnet.

Fenstereinteilung:
______________________
|...Eingabe..|... Zeichnen|   
|...............|......bereich.|    
|...............|................|
|...............|................|
|...............|................|
|_____________________

Ich habe das Fenster mit dem LayoutManager in zwei Teile aufgeteilt(siehe oben), links mit der Eingabemöglichkeit und Rechts mit einem Bereich, in dem gezeichnet wird. Ich habe mir gedacht, dass ich mit einer Methode auf dem rechten Panel malen kann.

Der Linke Teil hat keine Probleme bereitet. Als ich mich ans Zeichnen machen wollte und die Methode paint(..) überschreibe wird auf einmal der Linke Teil nichtmehr angezeigt.

Habt ihr eine Idee, was ich falsch mache?

Hier mal der Quellcode mit nicht überschriebener paint(..) funktion:


```
import java.applet.Applet;
import java.net.URL;
import java.util.Date;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class layout extends Applet implements ActionListener {

	private static final long serialVersionUID = 1L;
	  

   
    
    private Container EingabeContainer;
    private Container GraphikContainer;
   

    private Container KernauswahlContainer;
    private Container ArbeitspunktEingabeContainer;
    private Container Berechnecontainer;

	private JTextField tf;

	URL base;
	Image my_gif;
	MediaTracker mt;
	public void init() {
		this.setMenu();
		URL base = null;
		mt = new MediaTracker(this);
		try { base = getDocumentBase();}
        catch (Exception e) {}
        my_gif = getImage(base,"Ma.gif");
        mt.addImage(my_gif,1);
        try {
              mt.waitForAll();
         }
         catch (InterruptedException  e) {}
	}

	private void setMenu() {
		URL base = null;
		Image my_gif;
		MediaTracker mt;
		mt = new MediaTracker(this);
		try { base = getDocumentBase();}
        catch (Exception e) {}
        my_gif = getImage(base,"hallo.gif");
        mt.addImage(my_gif,1);
        try {
              mt.waitForAll();
         }
         catch (InterruptedException  e) {}
	          
		//f = new JFrame();
		this.setLayout(new GridLayout());

		
	    
	    KernauswahlContainer = new Container();
	    KernauswahlContainer.setLayout(new GridLayout(2,1,1,1));
	    
	    ArbeitspunktEingabeContainer = new Container();
	    ArbeitspunktEingabeContainer.setLayout(new GridLayout(2,0,1,1));//(Anzahl Zeilen, x)
	    
	    Berechnecontainer = new Container();
	    Berechnecontainer.setLayout(new FlowLayout());
		
	    EingabeContainer=new Container();
		EingabeContainer.setLayout(new GridLayout(0,1,1,1));

		EingabeContainer.add(KernauswahlContainer);
		EingabeContainer.add(ArbeitspunktEingabeContainer);
		EingabeContainer.add(Berechnecontainer);
		

		JLabel KernLabel=new JLabel("Kerneingabe: ");
		String[] KerneStringArray = { "112", "123", "155", "151", "151" };
		JLabel mfeLabel=new JLabel("mFe/kg");
		JTextField mfeTextField = new JTextField();
		JLabel lfeLabel=new JLabel("lfe/cm");
		JTextField lfeTextField = new JTextField();
		JLabel afeLabel=new JLabel("afe/cm²");
		JTextField afeTextField = new JTextField();
		
		JComboBox KernComboBox = new JComboBox(KerneStringArray);
		KernComboBox.addActionListener(this);

		
		KernauswahlContainer.add(KernLabel);
		KernauswahlContainer.add(KernComboBox);
		KernauswahlContainer.add(new JLabel(""));
		KernauswahlContainer.add(new JLabel(""));
		KernauswahlContainer.add(new JLabel(""));
		KernauswahlContainer.add(new JLabel(""));
		KernauswahlContainer.add(mfeLabel);
		KernauswahlContainer.add(mfeTextField);
		KernauswahlContainer.add(lfeLabel);
		KernauswahlContainer.add(lfeTextField);
		KernauswahlContainer.add(afeLabel);
		KernauswahlContainer.add(afeTextField);
		this.add(EingabeContainer,BorderLayout.WEST);
		GraphikContainer=new Container();

		ArbeitspunktEingabeContainer.add(new JLabel());
		JLabel flabel = new JLabel("f/kHz");
		JTextField fTextfield=new JTextField();
	     ArbeitspunktEingabeContainer.add (flabel);
	     ArbeitspunktEingabeContainer.add (fTextfield);
		Container RadioButtonContainer = new Container();
		RadioButtonContainer.setLayout(new GridLayout(0,1));
	     //ButtonGroup radioGroup;
	     JCheckBox radioB;
	     JCheckBox radioU;
	     JCheckBox radioI;
	     radioB=new JCheckBox("Bpk");
	     radioB.doClick();
	     radioU=new JCheckBox("Upk");
	     radioI=new JCheckBox("Ipk");
	     RadioButtonContainer.add(radioB);
	     RadioButtonContainer.add(radioU);
	     RadioButtonContainer.add(radioI);
	     ArbeitspunktEingabeContainer.add(RadioButtonContainer);
	     JLabel BpkLabel=new JLabel("Bpk/T");
	     JTextField BUITextField = new JTextField("0,3000");
	     ArbeitspunktEingabeContainer.add (BpkLabel);
	     ArbeitspunktEingabeContainer.add (BUITextField);
	     
	     JLabel PfeLabel = new JLabel("PFe/(W/kg)");
	     JTextField PfeTextField= new JTextField("           ");
	     JLabel PLabel = new JLabel("P/(W/core)");
	     JTextField PTextField= new JTextField("           ");
	     Berechnecontainer.add(PfeLabel);
	     Berechnecontainer.add(PfeTextField);
	     Berechnecontainer.add(PLabel);
	     Berechnecontainer.add(PTextField);
	     JButton BerechneButton = new JButton ("Berechne");
	     Berechnecontainer.add(BerechneButton);
		
		this.add(GraphikContainer);
		JLabel PowerLossLabel = new JLabel("Powerloss chart");
		GraphikContainer.add(PowerLossLabel);
	     
		
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		tf.setText(((JButton) arg0.getSource()).getText());
	}
	
	
	// public void paint(Graphics g) { 
	        
	//} 
	
}
```

Habt Ihr eine Idee, wie ich in den Linken Teil etwas zeichnen kann?
Da soll letztendlich ein x-y-Diagram rein(Verluste über frequenz).

PS.: Ich weiß, dass das Layout zur Zeit nicht ganz so gut aussieht. Ich benutze für den Fall einen nicht ganz so passenden Layout Manager. Ich bin für jeden Tipp dankbar!

Grüße 
TTrp


----------



## eRaaaa (24. Jul 2011)

Nur kurz über den Code drüber geschaut:

- Also zunächst würde ich nur bei Swing bleiben Applet-> JApplet etc. also nicht wild Komponenten mischen
- Dann würde ich zwei JPanels erstellen, eines für die linke und eines für die rechte Seite
- Dann würde ich nicht die paint Methode des Applets überschreiben sondern paintComponent des rechten jPanels! Dann sollte es nicht zu diesen Problemen kommen!


----------



## TTrp40 (25. Jul 2011)

eRaaaa hat gesagt.:


> - Dann würde ich nicht die paint Methode des Applets überschreiben sondern paintComponent des rechten jPanels! Dann sollte es nicht zu diesen Problemen kommen!



Hallo eRaaa,
danke für den Tipp. Das Umwandeln von Applet->JApplet hat wunderbar funktioniert. 
Auch das Einbinden der beiden Panels war problemlos. 
Probleme habe ich beim Überschreiben der paintComponent Methode des rechten Panels. Wie überschreibe ich denn die Methode eines spezifischen Panels? oder kann ich der paintComponent() Methode eine getSource()==rechtesPanel abfrage einbauen? Oder überschreibe ich die Methode beim erstellen des rechten Panels?


Kann ich denn in einem Panel die Kompnenten (JButtons, JTextFields usw) genauso anordnen wie in einem Container? 

Noch eine Frage bzgl. Layout Manager:
Ich benutze den GridLayout, die TextFelder sehen da aber etwas blöd aus, da sie eine große höhe haben. Ich wollte zuerst einen Null Layout benutzen und die Komponenten mit setBorder selbst anordnen, was nicht so recht funktioniert hat.

Habt ihr einen Tipp, mit welchem Layout Manager man die Komponenten anordnen kann, sodass das JApllet anschließend auch gut aussieht? Zur Zeit sieht es noch so aus:







und wenn man das Fenster vergrößert, dann werden die Textfelder sogar noch größer.
Irgendwelche Empfehlungen?

Danke für die Hilfe
TTrp40


----------



## eRaaaa (25. Jul 2011)

Ja beim GridLayout bekommen eben alle Komponenten die gleiche Größe. Layouts können auch verschachtelt werden!
Ansonsten gibts neben den Standartlayouts auch noch so etwas wie das TableLayozut, das ist etwas flexibler als das GridLayout oder auch das MigLayout. Einfach mal anschauen und ausprobieren.
Wegen dem Panel. Es gibt da auch wieder mehrere Möglichkeiten, entweder du schreibst eine eigene Klasse und erweiterst Jpanel (extends JPanel) und überschreibst dann einfach paintComponent oder du schreibst beim Erstellen des Panels ein Konstrukt ala

```
new JPanel(){
			@Override
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				//hier dein Code....
			}
		};
```


----------



## TTrp40 (27. Jul 2011)

Hallo eRaaa,

danke für die Indo, ich kann jetzt auf das Linke JPanel malen. Funktioniert gut, ich muss noch ein bisschen grips einsetzen, um ein x-y-Diagramm mit automatischer Skalierung und möglichkeit der logarithmischen Darstellung einzufügen. 
Als Physiker und mit Hilfe der Math-Klasse sollte das kein Problem sein.

Etwas mehr probleme bereitet mir zur Zeit das Layout.



> Ja beim GridLayout bekommen eben alle Komponenten die gleiche Größe. Layouts können auch verschachtelt werden!
> Ansonsten gibts neben den Standartlayouts auch noch so etwas wie das TableLayozut, das ist etwas flexibler als das GridLayout oder auch das MigLayout. Einfach mal anschauen und ausprobieren.



Ich habe mir auf der Seite "http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html" einige angeschaut und wollte dann das SpringLayout verwenden. Hier wird dann ein GUI-Builder empfohlen. Hat schon jemand damit erfahrungen gesammelt und welchen GUI-Builder könnt ihr für Eclipse empfehlen?

Danke für die Hilfe
TTrp


----------



## TTrp40 (27. Jul 2011)

Ich versuche schon etwas länger den Visual Editor zu installieren mit einigen Problemen. Es gibt von dem VE nur eine TGZ Datei, die sich mit 7tip nicht entpacken lassen möchte. Alle andere Seiten zu VE bei Eclipse sind nicht mehr verfügbar.
Kämpfe ich gerade auf einem verlorenen Posten oder macht es sinn, mal das VE auszuprobieren?
Grüße
TTrp


----------



## Gast2 (27. Jul 2011)

Ich würde dir für Eclipse den WindowBuilder Pro empfehlen:
Installing WindowBuilder Pro

Aber bevor du anfängst dir mit nem GUI Designer da was hinzuklicken solltest du schon verstanden  haben wie, das mit den layoutmanagern etc. funktioniert.


----------



## TTrp40 (28. Jul 2011)

Hallo Leute,
ich brauch nochmal eure Hilfe.
Ich habe EikeBs Tipp zu herzen genommen und möchte mich mit den layoutmanagern weiter außeinandersetzen, bräuchte aber mal einen Tipp für einen passenden LayoutManager.


Die linke Seite soll aus 3 Teilen bestehen, Teil Kernauswahl, Teil Arbeitspunkteinabe und Teil Berechnen mit Texten, Textfeldern, einer Liste, drei Radiobuttons (gegroupt) und einem Berechne-Button
So soll es einmal aussehen: 
______________________________________<<Teil Kerneingabe
|....Überschrift:"Eingabe"...........................|
|Text:"Kern"....Liste:"Auswahlliste"..............|
|...Textfeld mfe, lfe, afe............................|
_______________________________________<<Teil Arbeitspunkteinabe
|Text:"frequenz".....Textfeld:Frequenz..........|
|Radiobutton:"U".......................................|
|Radiobutton:"I"....Text:"U/I/B" Textfeld "UIB".|
|Radiobutton:"B".......................................|
_______________________________________<<Teil Berechnen
|Text:"Pfe"....Textfeld:"Pfe".........................|
|Text:"P".......Textfeld:"P"...........................|
|Button:"Berechne"....................................|
_______________________________________

Die Textfelder sollten etwa die Größe der Schrift und eine typische Länge haben. 

Was für einen LayoutManager könnt ihr dafür empfehlen?

Viele Grüße und Danke für die Hilfe
TTrp


----------



## jgh (28. Jul 2011)

imho ein BorderLayout mit North,Center und South für deine 3 Panels, die Panels selber würde ich in wahrscheinlich mit FlowLayout, oder GridbagLayout machen.
kannst natürlich auch die 3 Panels (da sie ja scheinbar (fast) gleich groß sind) auch in ein GridLayout tun und dann die Panels halt auch mit -wie oben- mit FlowLayout, oder GridbagLayout machen.

oder halt alles in GridBagLayout, ineinander verschachtelt...ist sicherlich der mächtigste LM in SDK


----------



## TTrp40 (29. Jul 2011)

jgh hat gesagt.:


> oder halt alles in GridBagLayout, ineinander verschachtelt...ist sicherlich der mächtigste LM in SDK



Vielen Dank für den Tipp mit dem GridBag
Funktioniert einwandfrei!

Wie weit sind denn java-Fährige Browser auf der Welt verbreitet?
Mein Applett soll in einem Unternehmen benutzt werden, damit potentielle Kunden sich die Verluste von Bauteilen, berechnen und in einem Graphen anschauen können.

Wenn es nicht weit verbreitet ist werde ich noch eine Extra HTML-Seite mit Formularen erstellen müssen.

Grüße
TTrp


----------

