Zeichnen in zwei Fenstern

Limoneneis

Mitglied
Hallo,

ich lerne gerade AWT/Swing. Ich möchte in meiner GUI zwei Fenster haben die ich separat bemalen kann. Wie geht das? Ich kann ja immer nur eine paint-Methode manipulieren. Ich bräuchte aber für jedes Fenster eine separate paint-Funktion.

Kann mir bitte jemand weiterhelfen?

grüße
 
Man kann in jedes Fenster ein JPanel legen, in dem man die paintComponent-Methode passend überschrieben hat. Vielleicht zielt deine Frage darauf ab, dass es ggf. unterschiedliche Klassen sein müssen?
 
Hallo,

danke für die Antwort aber was ich machen will, ist, dass man Innerhalb eines Fensters zwei weitere Subfenster hat, die immer sichtbar sind.

Links male ich zB dann kreise und rechts unabhängig davon rechtecke. Das müssten ja dann zwei Graphics-Objekte (zB g1, g2) sein.

Wie kann ich das Java verklickern?

danke
 
Das müssten ja dann zwei Graphics-Objekte (zB g1, g2) sein.

Ja und Nein. Du zeichnest nicht direkt, indem du dir ein Graphics-Objekt holst, sondern indem du die paintComponent() Methode eines JPanels (oder einer von JComponent erbenden Klasse) überschreibst.

Wenn du wirklich zwei "echte" Fenster, also mit Schließen-Funktion, Minimieren, etc. willst, dann empfiehlt es sich zwei JInternalFrames zu erstellen, und deren ContentPane jeweils ein JPanel zuweisen, in welchem du wie oben beschrieben, zeichnest.

Falls du allerdings einfach nur 2 Zeichenbereiche meinst, reicht es auch aus 2 JPanel direkt auf dein Hauptframe zu adden und in diesem zu zeichen.

Für deinen Fall empfiehlt imo das Zeichen aus KEIN Swing-Tutorial , der Teil mit dem Interface Paintable.
 
...

Falls du allerdings einfach nur 2 Zeichenbereiche meinst, reicht es auch aus 2 JPanel direkt auf dein Hauptframe zu adden und in diesem zu zeichen.

....

Hi ich habe mich mal daran versucht, aber ich kriege das irgendwie nicht hin. Das hier habe ich programmiert (bin Anfänger) und habe mir vieles abgeguckt von anderen Codes.

Java:
public class AWTFrame {
    
    public AWTFrame(){
        
        PanelBsp p1 = new PanelBsp();
        PanelBsp p2 = new PanelBsp();
        p1.setSize(100, 100);
        
        JFrame f = new JFrame("Fenster");
        f.setSize(300,300);
        
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        p1.setPreferredSize(new Dimension(300,300));
        f.setLayout(new BorderLayout());
        f.add(p1);
        f.add(p2); //Wie kann ich hier die Position festlegen?
        f.setBackground(Color.yellow);
        f.pack();
        f.setVisible(true);
    }
    
}


Dann noch eine Klasse für Panels

Java:
public class PanelBsp extends JPanel{
    
    public PanelBsp(){
        
        this.setSize(100, 100);
        this.setBackground(Color.red);
        
        this.setVisible(true);
        
    }
    
    public void paint(Graphics g){
        super.paint(g);
        g.drawString("Hallo", 50, 50);
        
    }
    
    
    
}

und die Main:

Java:
    public static void main(String[] args) {
        AWTFrame awtF = new AWTFrame();
    }

Ich hätte das gerne so, dass Links ein Panel mit Hallo steht und rechts davon auch nochmal ein Panel ist. Anschließend soll man beide Panel getrennt voneinander manipulieren.

gruß
 
Die "allgemeinste" Trennung wäre ein
Java:
public class OtherPanelBsp extends JPanel{
    
    public OtherPanelBsp(){
        
        this.setSize(100, 100);
        this.setBackground(Color.red);
        
        this.setVisible(true);
        
    }
    
    public void paint(Graphics g){
        super.paint(g);
        g.drawString("Was anderes", 50, 50);
        
    }
    
    
    
}
und in der Hauptklasse dann eben
OtherPanelBsp p2 = new OtherPanelBsp();

Wenn es nur um einen anderen String ginge (oder überhaupt, irgendwas "ähnliches") könnte man sich natürlich tausende von "weniger getrennten" Abstufungen vorstellen...
 
1.
Limoneneis hat gesagt.:
Ich hätte das gerne so, dass Links ein Panel mit Hallo steht und rechts davon auch nochmal ein Panel ist.

OK, dann reicht dafür wohl das GridLayout aus.

2.
Ein
Code:
[B]this.setVisible(true);[/B]
ist völlig unnötig bei einer von JComponent erbenden Klasse (--> JPanel) aufzurufen, da standartmäßig eh schon sichtbar.

3.
Bei einem JPanel wird in der Regel zum Zeichnen nicht die paint()-Methode überschrieben, sondern die paintComponent().

Desweiteren kann es lohnenswert sein, bei Swing mit der ContentPane zu arbeiten.

4.
Limoneneis hat gesagt.:
Anschließend soll man beide Panel getrennt voneinander manipulieren.

Ich jetzt zwar nicht genau inwiefern du was manipulieren möchtest, aber ich glaube ganau hierfür bietet sich der Link an, dem ich dir bereits geben habe, mit einem Interface Paintable zu arbeiten. Ich wollte mal nicht so sein und hab es auf deine Code mal angewand:
Java:
import javax.swing.JFrame;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Color;
import java.awt.Graphics2D;

public class AWTFrame {
    
    public AWTFrame(){
        PanelBsp p1 = new PanelBsp();
		p1.setPreferredSize(new Dimension(300,300));
		
        PanelBsp p2 = new PanelBsp();
        p2.setPreferredSize(new Dimension(300,300));
        
        JFrame f = new JFrame("Fenster");
        //f.setSize(300,300); // Fällt weg, da die ContentPane die Größe 600x300 
							  // erhält, und pack() augerufen wird
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new GridLayout()); // GridLayout anstatt BorderLayout
        f.getContentPane().add(p1);
        f.getContentPane().add(p2);
        f.getContentPane().setBackground(Color.yellow);
        f.pack();
        f.setVisible(true);
		
		p2.getPaintables().add(new Paintable() {
			public void paintObject(Graphics2D g2) {
				// Hier der dynamisch hinzugefügte Zeichncode, bsbw.:
				g2.setColor(Color.GRAY);
				g2.fillRect(10, 10, 50, 50);
			}
		});
		// +Aufruf zum Neuzeichnen:
		p2.repaint();
    }
    
}

Java:
import javax.swing.JPanel;
import java.util.List;
import java.util.ArrayList;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Color;

public class PanelBsp extends JPanel{
	private List<Paintable> painables;
	
    public PanelBsp(){
		painables = new ArrayList<Paintable>();
        this.setBackground(Color.red);
    }
	
    public void paintComponent(Graphics g){
        super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		
        g2.drawString("Hallo", 50, 50);
		for(Paintable paintable: paintables) {
			paintable.paintObject(g2);
		}
    }
	
	public List<Paintable> getPaintables() {
		return paintables;
	}
}

Java:
import java.awt.Graphics2D;

public interface Paintable {
	public void paintObject(Graphics2D g2);
}

Mögliche Fehler oder fehlende Imports im Code sind möglich!!!


P.S AWTFrame ist ein schlechter Name für ne Klasse die mit JFrame arbeitet!
 

Zurück
Oben