JFrames

schiese

Erfahrenes Mitglied
Hallo,
ich wollte eine Art Schachbrettmuster zeichnen, was auch klappt. Nur wenn ich jetzt über das Muster einen JButton fügen möchte (nur zu Übungszwecken) zeigt er mir den Button erst an, wenn ich mit der Maus rüberfahre. Kann es sein, dass er unter dem JPanel liegt und deshalb erst von ihm verdeckt wird?


Java:
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;

//import java.awt.*;


public class QuadratZeichnen extends JPanel {
	
	private static final int breite = 500;
	private static final int hoehe = 400;
	
	public QuadratZeichnen() {
	}
	
	public void paint(Graphics g) {
		int m = 2;
		int n = 3;
		for(int i = (int)getHeight()/(m+1);i <= getHeight(); i = (int)i + getHeight()/(m+1)) {
		g.drawLine(0,Math.round(i),getWidth(),Math.round(i));
		}
		for(int j = (int)getWidth()/(n+1); j <= getWidth(); j = (int) j + getWidth()/(n+1)) {
		g.drawLine(Math.round(j), 0, Math.round(j), getHeight());
		}
	}
	
	public static void main(String[] args) {
		
		JFrame f = new JFrame("Fenster");
		f.setSize(breite,hoehe);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
		f.setResizable(false);

		QuadratZeichnen neu = new QuadratZeichnen();
		JButton button = new JButton();
		button.setText("Button");
		button.setEnabled(true);
		neu.add(button);
		f.add(neu);
	}

}

Gruß schiese
 
1. Bei Swing-Komponenten sollte man statt paint eigentlich paintComponent benutzen.
2. Entweder aktualisierst du dein JFrame mit SwingUtilites#updateComponentTreeUI oder du lässt dein JFrame erst zum Schluss sichtbar machen, sprich das setVisible(true) erst aufrufen, nachdem alle Komponenten eingefügt wurden.
 
Vielen Dank, das war es.
@Akeshihiro ist ja eigentlich auch logisch. Vielen Dank

Gruß schiese
 
Zuletzt bearbeitet:
Ich habe jetzt noch eine weitere Frage zu meinem Programm. Und zwar möchte ich den Aufruf des Frames in einen Konstruktor packen und die paint-Methode in eine andere Klasse auslagern. Das klappt auch alles wunderbar, nur wenn ich ein neues Objekt meines Spielbrettes erstelle, habe ich zwei JFrames statt eines (Wenn ich es richtig vertanden habe, wird die paint()-Methode aufgerufen, wenn es Veränderungen am JFrame gibt. Ich es z.B. vergrößer. Ich lasse mir ja zusätzlich Hallo in der paint()-Methode ausgeben. Es erscheint zweimal, also wird sie zweimal aufgerufen). Hängt das damit zusammen, dass ich im Konstruktor ein neues JFrame-Objekt erstelle?

Java:
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;
	
class MeinPanel extends JPanel {
	public void paint(Graphics g) {
		g.drawLine(10,10,150,150);
		System.out.println("Hallo");
	}
}

public class Spielbrett extends JFrame {	
	
	public int breiteSpielfeld;
	public int hoeheSpielfeld;
	
	
	public Spielbrett(int breite, int hoehe) {
		JFrame neu = new JFrame("Spielfeld");
		this.breiteSpielfeld = breite;
		this.hoeheSpielfeld = hoehe;
		neu.setSize(breite,hoehe);
		neu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		neu.add(new MeinPanel());
		neu.setVisible(true);
	}
	
	
	public static void main(String[] args) {
		Spielbrett aufruf = new Spielbrett(700,500);
		//aufruf.add(new MeinPanel());
		//aufruf.setSize(700,500);
		//aufruf.setVisible(true);
	}
	
}

Gruß schiese
 
Hi,

deine Klasse Spielbrett erbt ja von JFrame, ist also schon selbst ein eigenes Frame. Wenn du also den Konstruktor der Klasse aufrufst, wird hier schonmal ein Frame erzeugt, da jede Instanz der Klasse Spielbrett ein Frame ist. Auf diesem Frame, setzt du dann auch die Höhe und die Breite. Zusätzlich erzeugst du im Konstruktor aber mit

Java:
JFrame neu = new JFrame("Spielfeld");
neu.setSize(...);

ein weiteres Spielfeld, was du dann auch anzeigst.
Eigentlich müsste es bei dir eher folgendermaßen aussehen.

Java:
public class Spielbrett extends JFrame {

  public int breiteSpielfeld;
  public int hoeheSpielfeld;

  public Spielbrett(int breite, int hoehe) {
    this.setSize(new Dimension(breite, hoehe);
    this.setTitle("Spielbrett");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.getContentPane.add(new MeinPanel());
    this.pack();
  }

  public static void main(String[] args) {
     Spielbrett brett = new Spielbrett(700, 500);
  }


}

Das sollte eigentlich funktionieren. Ich hab den Code allerdings gerade per Hand ohne Testen aus dem Kopf geschrieben, also keine 100%ige Garantie und Geld zurück gibt es eh nicht :D

Gruß
Der Wolf
 
Zuletzt bearbeitet:
Hi,
habe es auch gerade hinbekommen. Habe es ohne this. Beide Varianten funktionieren aber.

Vielen Dank, schiese
 
Zurück