JPanel repaint() wird nicht gemacht!

  • Themenstarter Themenstarter dreadlord
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
D

dreadlord

Gast
Hallo,
mein Problem ist folgendes, ich erstelle nach einem Buttonklick einen JPanel, wo ich drauf zeichne, jedoch möchte
ich auch das sich das Fenster noch mit vergrößert! Nun das mit dem Fenter vergrößern habe ich mit der resize()
Methode gemacht und funktioniert auch, jetzt ist nur der Panel noch nicht im vergrößerten Zustand!
Nachdem ich den JPanel dem Container hinzugefügt habe, habe ich auch nochmal einen validate() und repaint()
ausgeführt und es mit dem ComponentListener auch, jedoch passt sich der JPanel erst der Größe an
wenn ich die Fenstergröße manuell verändere!
Es wäre super wenn wir jemand damit weiterhelfen könnte!
 
Versuch bitte folgendes:

Code:
private JPanel jp = new JPanel();
jp.updateUI();
Ansonsten bitte deinen Code mal posten, merci.

Gruss Adi aus der Schweiz
 
okay also bei mir gibts die Methode update() aber kein updateUI(), aber hat trotzdem keinen Effekt!
Ich hab den Quelltext mal ein wenig abgekürzt und nur die relevanten Sachen miteinbezogen:

MainWindow.java:
Code:
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*; 

public class MainWindow extends JFrame implements ActionListener,Serializable {
	
	private static final int MAINMODE = 1;
	private static final int GAMEMODE = 2;

	Container content;
	// .....
	
	//Constructor
	public MainWindow(String title) {
		super(title);
		setLookAndFeel();

		content = getContentPane();
		setMainMode(MAINMODE);

		// .....
		
		addWindowListener(new WindowClosingAdapter());
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		
		pack();
		setVisible(true);
	}

	public void actionPerformed(ActionEvent e) {
		Object action = e.getSource();
		
			if(action == menuitems[0]) {
				// .....
			}
			else if(action == menuitems[1]) {
				// .....
			}
			else if(action == menuitems[3]) {
				setMainMode(GAMEMODE);
			}
			else if(action == gamebtns[0] || action == menuitems[4]) {
				setGameMode(Game.FOUR_WINS);
			}
			// .....
	}

	private void setLookAndFeel() {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			SwingUtilities.updateComponentTreeUI(this);
		} catch(Exception e) {
			System.err.println("Couldn't use the systems Look and Feel!");
		}
	}
	
	private void buildConstraints(GridBagConstraints gbc,int gx,int gy,
			  					  int gw,int gh,int wx,int wy) {
		gbc.gridx = gx;
		gbc.gridy = gy;
		gbc.gridwidth = gw;
		gbc.gridheight = gh;
		gbc.weightx = wx;
		gbc.weighty = wy;
	}

	private void setMainMode(int prevMode) {
		if(prevMode == GAMEMODE) {
			menuitems[1].setEnabled(false);
			menuitems[3].setEnabled(false);
			for(int i=4;i<8;i++)
				menuitems[i].setEnabled(true);
		
			content.removeAll();
		}
		
		GridBagLayout gbl = new GridBagLayout();
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.insets = new Insets(5,5,5,5);
		content.setLayout(gbl);
		
		buildConstraints(gbc,0,0,1,1,0,0);
		gbl.setConstraints(gameinfo,gbc);
		content.add(gameinfo);
		
		gbc.fill = GridBagConstraints.HORIZONTAL;
		for(int i=0;i<gamebtns.length;i++) {
			buildConstraints(gbc,0,i+1,1,1,0,0);
			gbl.setConstraints(gamebtns[i],gbc);
			content.add(gamebtns[i]);
		}
		
		if(prevMode == GAMEMODE) {
			pack();
			content.validate();
			content.repaint();
		}
	}
	
	private void setGameMode(int gameid) {
		int rows=8;
		int cols=8;

		// .....
		
		content.removeAll();
		
		GridBagLayout gbl = new GridBagLayout();
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.BOTH;
		gbc.anchor = GridBagConstraints.NORTHWEST;
		gbc.insets = new Insets(5,5,5,5);
		content.setLayout(gbl);
		
		gamefield = new GameField(player1,player2,gameid,rows,cols);
		
		buildConstraints(gbc,0,0,1,6,1,1);
		gbl.setConstraints(gamefield,gbc);
		content.add(gamefield);

		// .....
		
		this.resize(500,500);
		content.validate();
		content.repaint();
	}

GameField.java:
Code:
import java.awt.*;
import javax.swing.*;

public class GameField extends JPanel {
	public static final int NOTSET = 0;
	public static final int PLAYER1 = 1;
	public static final int PLAYER2 = 2;

	private Gamer player1,player2;
	private int gameid;
	protected int rows,cols;
	protected int[][] gamematrix;
	
	public GameField(Gamer p1,Gamer p2,int gid,int rows,int cols) {
		gamematrix = new int[rows][cols];
		this.rows = rows;
		this.cols = cols;
		gameid = gid;
		player1 = (Gamer)p1.clone();
		player2 = (Gamer)p2.clone();
		this.setBackground(Color.WHITE);
	}

	// ......

	public void paintComponent(Graphics g) {
		int sizeX = getSize().width;
		int sizeY = getSize().height;
		int maxdim = (sizeX>sizeY)?sizeY/rows:sizeX/cols;
		int endline = (sizeX>sizeY)?sizeY-sizeY%maxdim:sizeX-sizeX%maxdim;
		
		g.setColor(Color.BLACK);
		for(int i=0;i<=rows;i++)
			g.drawLine(0,i*maxdim,endline,i*maxdim);
			
		for(int j=0;j<=cols;j++)
			g.drawLine(j*maxdim,0,j*maxdim,endline);
		
		for(int i=0;i<rows;i++) {
			for(int j=0;j<cols;j++) {
				int val = gamematrix[i][j];

				if(val != 0) {
					// The actual field has been already set
					int posX = i*maxdim;
					int posY = j*maxdim;
					int gcid = (val == 1)?player1.getGameCoinId():player2.getGameCoinId();
					Color gcc = (val == 1)?player1.getGameCoinColor():player2.getGameCoinColor();
					
					g.setColor(gcc);
					if(gcid == STAR) drawStar(g,posX,posY,maxdim);
					else if(gcid == HEXAGON) drawHexagon(g,posX,posY,maxdim);
					else drawHeart(g,posX,posY,maxdim);
				}
			}
		}
	}

Falls ihr mehr vom Code braucht lasst es mich wissen, jedoch denke ich ist das der Teil, der für die Anpassung
des JPanel's reichen müsste!
 
Versuch' das bitte NICHT!

updateUI ruft man auf, wenn sich das Look & Feel geändert hat - also so gut wie nie. Dass dabei "zufällig" auch ein bißchen geValidatet wird, ist der Grund dafür, dass es immer wieder empfohlen wird. Es ist aber eigentlich Unfug.
(Irgendwie kommt mir das bekannt wor).

An den Fragesteller: Poste ein kleines compilierbares Programm, bei dem der Fehler auftritt, dann wird man dir die Lösung sagen können.

Edit: Hast du ja schon - war zu langsam. Mal drüberschauen...
 
So als schnelle Lösung: Ruf' das validate und repaint doch auf dem Fenster auf (und nicht nur auf dem content)
 
am einfachsten machst du das so

Code:
panel.add(kindPanel);
panel.validate();
panel.repaint();

wofür brauchst du das denn???

Wenn du nur ein fenster haben willst und die ganzen panels hinein laden willst ist JInternalFrame besser geeignet.
Die sehen vor allen dingen beser aus 😉.

JInternalFrame addest du auf einen DesktopPane.

Also quasi so:

Code:
JDesktopPane desktop = new JDesktopPane();
JInternalFrame internFrame = new JInternalFrame(); 

desktop.add(internFrame);

ist eine bessere lösung und eine schönere 😀
 
okay das was marco13 geschrieben hat ist die Lösung meines Problems!
ich muss natürlich den JFrame neu anpassen und nicht den JPanel content!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben