JPanel wird erst durch aufziehen des Fensters sichtbar

Zuecho

Neues Mitglied
Guten Abend zusammen,
ich bin momentan dabei ein Sudoku-Spiel zu programmieren.
Das ganze ist mein erstes etwas größeres Projekt und auch mein erster Versuch eine Grafische Obergläche einzubauen.

Im Grunde habe ich bisher alles ganz gut umgesetzt bekommen, das Spiel ist eigentlich auch soweit grob fertig. Leider hab ich noch ein paar Schönheitsfehler, welche ich nun auch nach ewigen Probieren nicht wegbekommen habe. Evtl. könnt ihr mir ja helfen.

Problem 1:
Wenn ich das Spiel starte, wird ab und zu mein JPanel, in welchem ich das 9x9-Sudokufeld liegen habe, falsch oder gar nicht angezeigt. Wenn ich allerdings meinen JFrame per Maus ein wenig auf- oder zuziehe erscheint das JPanel mit dem Raster.
Das ganze tritt manchmal bei jedem 10., manchaml aber auch bei jedem 2. programmstart auf.

Problem 2:
Wenn ich nun im Spiel "Neues Spiel" drücke soll eine Anfangsbelegung in das 9x9-Raster eingetragen werden. Diese wird aber auch erst angezeigt, nachdem ich den JFrame auf- oder zuziehe.

Evtl ist es ja sogar das gleiche Problem. Ich kann aber leider nichts finden.
Ich habe hier mal eine etwas abgespeckte Version meines Spiel für euch:

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * @author Zuecho
 *
 */
public class Mini_aufziehProblem2 {
	
    static final int 		_GROESSE = 9;
    static Spielfeld 		_spielfeld;
    static JFrame 			_frame;
    static JPanel 			_oben;
    static JPanel 			_mitte;
    static JTextField[][] 	_textfeld;
    static JButton 			_buttonHilfe;
    static JButton 			_buttonLoesen;

    /**
     * Konstruktor
     * 
     * Der Konstruktor initialisiert die GUI und das Spielfeld
     */
	public Mini_aufziehProblem2() {
		oberflaeche();
	}

	/**
	 * Diese Main-Methode startet das Spiel
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		@SuppressWarnings("unused")
		Mini_aufziehProblem2 losgehts = new Mini_aufziehProblem2();
	}
	
    /**
     * Initialisiert die GUI
     */
    private static void oberflaeche() {
        _frame = new JFrame();
        _frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
        _frame.setVisible(true);
        _frame.setSize(500, 550);
        _frame.setLayout( new BorderLayout() );
        
        _oben = new JPanel();
        
        JButton buttonNeu = new JButton("Neues Spiel");
        _oben.add( buttonNeu );
        buttonNeu.addActionListener( new ActionListener() {
        	@Override public void actionPerformed( ActionEvent ae ) {  
        		resetSpielflaeche();
        		_spielfeld = new Spielfeld();
        		spielflaeche();
        		schreibeFeld();
        		_buttonHilfe.setEnabled(true);
        		_buttonLoesen.setEnabled(true);
        	}
        });
        
        _buttonHilfe = new JButton("Hilfe");
        _oben.add( _buttonHilfe );
        _buttonHilfe.setEnabled(false);
        _buttonHilfe.addActionListener( new ActionListener() {
        	@Override public void actionPerformed( ActionEvent ae ) {
       
        	}
        } );
        
        _buttonLoesen = new JButton("Lösen");
        _oben.add(  _buttonLoesen );
        _buttonLoesen.setEnabled(false);
        _buttonLoesen.addActionListener( new ActionListener() {
        	@Override public void actionPerformed( ActionEvent ae ) {

        	}
        } );
        
        JButton buttonSchließen = new JButton("Schließen");
        _oben.add( buttonSchließen );
        buttonSchließen.addActionListener( new ActionListener() {
        	@Override public void actionPerformed( ActionEvent ae ) {
        		System.exit( 0 );
        	}
        });
        
        _frame.add(_oben, BorderLayout.PAGE_START);
        _oben.setVisible(true);
        
        
        _mitte = new JPanel();
        _mitte.setLayout( new GridLayout(9,9));
        _mitte.setSize(500, 500);
        _mitte.setVisible(true);
        _frame.add(_mitte, BorderLayout.CENTER);
        
        spielflaeche();
    }
    
    /**
     * Erstellt die Spielfläche mit dem Gitter
     */
    private static void spielflaeche() {
    	_textfeld = new JTextField[_GROESSE][_GROESSE];
    	
        for (int zeile = 0; zeile < _GROESSE; ++zeile) {
            for (int spalte = 0; spalte < _GROESSE; ++spalte) {
            	
            	// Erzeuge und formatiere JTextField
                _textfeld[zeile][spalte] = new JTextField();
                _textfeld[zeile][spalte].setHorizontalAlignment(JTextField.CENTER);
                _textfeld[zeile][spalte].setFont( new Font("Arial", Font.BOLD, 24) );
                
                // Erzeuge Ränder
                int unten=1;
                int rechts=1;
                if ( zeile == 2 || zeile == 5 ) {
                	unten = 3;
                }
                if ( spalte == 2 || spalte == 5 ) {
                	rechts = 3;
                }          	
                _textfeld[zeile][spalte].setBorder(BorderFactory.createMatteBorder(0, 0, unten, rechts, Color.BLACK));
                
                // Erzeuge ActionListener auf jeden Textfeld
                _textfeld[zeile][spalte].addActionListener( new ActionListener() {
                	@Override public void actionPerformed( ActionEvent ae ){

                	}
                });
                
                _mitte.add( _textfeld[zeile][spalte] );
            }
        }
    }
    
    /**
     * Diese Methode beschreibt ein Feld mit dem aktuellen Wert
     * und formatiert das Textfeld
     * 
     * @param zeile
     * @param spalte
     */
    private static void schreibeZelle(int zeile, int spalte) {
    	int wert = _spielfeld.gibZelle(zeile, spalte);
    	
    	// Textfeld beschriften
        if ( wert >= 1 && wert <= 9 ) {
          	_textfeld[zeile][spalte].setText( Integer.toString(wert) );
        }
        else {
        	_textfeld[zeile][spalte].setText( "" );
        }
        
        // Vorbelegte Felder formatieren
        if (_spielfeld.gibZelleVorbelegung(zeile, spalte) == true) {
        	  _textfeld[zeile][spalte].setEditable(false);
        }
        
        System.out.println("neu gemalt!");
    }
    
    /**
     * Diese Methode setzt alle Textfelder 
     */
    private static void schreibeFeld() {
        for (int zeile = 0; zeile < _GROESSE; ++zeile) {
            for (int spalte = 0; spalte < _GROESSE; ++spalte) {
            	schreibeZelle(zeile,spalte);
            }
        }
    }
    
    /**
     * Entfernt die Spielfläche
     */
    private static void resetSpielflaeche() {
    	_mitte.removeAll();
    }
    
}

Klasse Spielfeld()
Java:
/**
 * Diese Klasse erzeugt ein neues Sudokufeld, kann dieses Verändern und lösen
 * 
 * @author 
 * @version Feb. 2010
 */
public class Spielfeld
{
    int[][] _spielfeld;
    int[][] _loesungsfeld;
    int[][] _farbfeld;
    boolean[][] _vorbelegung;
    Startfelder _startfeld;
    int _groesse = 9;
    int _anzahlHilfe = 0;

    
    /**
     * Der Konstruktor initialisert ein neues Spielfeld und belegt dies mit Startwerten.
     * Ausserdem werden die weiteren Zustandsfelder belegt.
     */
    public Spielfeld() {
        _startfeld = new Startfelder();
        _spielfeld = new int[_groesse][_groesse];
        _loesungsfeld = new int[_groesse][_groesse];
        _vorbelegung = new boolean[_groesse][_groesse];
        _farbfeld = new int[_groesse][_groesse];  // 0: schwarz, 1: rot, 2: blau, 3: grün
        
        setUp();
    }
    
    /**
     * Diese Methode initialisiert das Spielfeld.
     * Dabei wird:
     *  - das _spielfeld mit einem Startfeld belegt
     *  - das _vorgegeben Feld initialisiert
     */
    private void setUp() {
    	// _spielfeld mit _startfeld belegen
    	_spielfeld = _startfeld.gibStartfeld().clone();
        int wert = 0;
        for (int zeile = 0; zeile < _groesse; ++zeile) {
            for (int spalte = 0; spalte < _groesse; ++spalte)
            {
            	wert = _startfeld.gibStartfeld()[zeile][spalte];
            	_spielfeld[zeile][spalte] = wert;
            }
        }
    	
    	// _vorbelegung belegen
        for (int zeile = 0; zeile < _groesse; ++zeile) {
            for (int spalte = 0; spalte < _groesse; ++spalte)
            {
                if (_spielfeld[zeile][spalte]!=-1) {
                	_vorbelegung[zeile][spalte] = true;
                }
            }
        }

	}
    
  
  
    /**
     * Gibt das Feld mit allen Feldbelegungen wieder
     * 
     * @return _spielfeld int[][] mit allen Feldbelegungen
     * 					  nicht belegtes Feld: -1
     */
    public int[][] gibSpielfeld() {
    	return _spielfeld;
    }
   
    /**
     * Gibt das Farb-/Vorbelegungsfeld als int[][]
     * 
     * @return _farbfeld int[][]
     */
    public int[][] gibFarbfeld() {
    	return _farbfeld;
    }
    
    /**
     * Gibt die Anzahl der bereits verbrauchten Lösungshilfen wieder
     * 
     * @return _anzahlHilfe int: Anzahl bereits Hilfe benutzt
     */
    public int gibAnzahlHilfe() {
    	return _anzahlHilfe;
    }
    
    /**
     * Gibt den Spielwert einer einzelnen Zelle
     * 
     * @return wert 
     */
    public int gibZelle(int zeile, int spalte) {
    	return _spielfeld[zeile][spalte];
    }
    
    /**
     * Gibt true, falls das Feld zur Startbelegung gehört
     * 
     * @return vorbelegung
     */
    public boolean gibZelleVorbelegung(int zeile, int spalte) {
    	return _vorbelegung[zeile][spalte];
    }
    
    /**
     * Gibt die Farbe einer einzelnen Zelle
     * 
     * @return farbwert
     */
    public int gibZelleFarbe(int zeile, int spalte) {
    	return _farbfeld[zeile][spalte];
    }
}

Klasse Startfelder()
Java:
/**
 * Deiese Klasse liefert eine Startbelegung für das Spielfeld
 * 
 * @author 
 * @version Februar 2010
 */
public class Startfelder {

    int[][] _startfeld;
    int _groesse = 9;

    /**
     * Initialisiert ein Startfeld
     */
    public Startfelder() {
        _startfeld = new int[_groesse][_groesse];
        for (int zeile = 0; zeile < _groesse; ++zeile)
        {
            for (int spalte = 0; spalte < _groesse; ++spalte)
            {
                _startfeld[zeile][spalte] = -1;
            }
        }
    }
    
    
    /**
     * Gibt das fertig initialisierte Feld als Int-Array zurück
     */
    public int[][] gibStartfeld() {
        initialisiereStartfeld();
        return _startfeld;
    }
    
    
     /**
     * Belegt das Startfeld mit einer Startaufstellung
     */
    private void initialisiereStartfeld() {
      _startfeld[0][0] = 1 ;
      _startfeld[0][4] = 2 ;
      _startfeld[0][6] = 7 ;
      _startfeld[0][7] = 5 ;

      _startfeld[1][0] = 6 ;
      _startfeld[1][4] = 5 ;
      _startfeld[1][7] = 4 ;

      _startfeld[2][1] = 2 ;
      _startfeld[2][3] = 4 ;
      _startfeld[2][7] = 1 ;

      _startfeld[3][0] = 2 ;
      _startfeld[3][2] = 8 ;

      _startfeld[4][1] = 7 ;
      _startfeld[4][3] = 5 ;
      _startfeld[4][5] = 9 ;
      _startfeld[4][7] = 6 ;

      _startfeld[5][6] = 4 ;
      _startfeld[5][8] = 1 ;

      _startfeld[6][1] = 1 ;
      _startfeld[6][5] = 5 ;
      _startfeld[6][7] = 8 ;

      _startfeld[7][1] = 9 ;
      _startfeld[7][4] = 7 ;
      _startfeld[7][8] = 4 ;

      _startfeld[8][1] = 8 ;
      _startfeld[8][2] = 2 ;
      _startfeld[8][4] = 4 ;
      _startfeld[8][8] = 5 ;
    }
}

Vielen Dank schonmal für eure Mühe!
 

Zuecho

Neues Mitglied
JFrame.pack() behebt zwar das Problem, führt aber zu neuen, da jetzt das Sudokufeld nicht mehr quadratisch ist und auch das ganze Fenster zu klein wird.

Allerdings funktioniert es, wenn ich _frame.validate() in Zeile 137 einfüge.
Die genaue Funktion von validate() ist mir jedoch noch nicht ganz klar.

Ich hab aber noch ein kleines weiteres Problem:
Ich habe ja die Buttons oben sowie das 9x9-Gitter mit BorderLayout im JFrame angeordnet.
Das 9x9-Gitter ist dabei in ein JPanel eingebettet, was wiederrum im Center des JFrames sitzt.
Allerdings wird das JPanel mit dem 9x9-Gitter nicht horizontal zentriert eingesetzt.
Links schließt dieses genau an den Frame an und rechts sind 3-4 px Freiraum.
Kann mir jemand sagen, wie ich das beheben kann?
Gehts das überhaupt mit BorderLayout?

Danke und Gruß,
Zuecho
 

Marco13

Top Contributor
Ohne Rand kann man das wohl nur darstellen, wenn die Größe durch 9 teilbar ist. Ansonsten bräuchte man ggf. einen eigenen LayoutManager
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J 2D-Grafik JPanel wird erst 1-2sek nach start des JFrames angezeigt AWT, Swing, JavaFX & SWT 3
R JPanel wird erst neu gezeichnet nach erneuter auswahl AWT, Swing, JavaFX & SWT 8
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
G Nur ein JPanel wird angezeigt AWT, Swing, JavaFX & SWT 9
L ImageIcon auf JPanel wird nicht angezeigt(keiner Fehlermeldung) AWT, Swing, JavaFX & SWT 11
T JTextField Array im JPanel wird nicht komplett angezeigt AWT, Swing, JavaFX & SWT 7
thobren Swing Im JPanel wird nur TextArea gelöscht AWT, Swing, JavaFX & SWT 13
C Image laden und Speichern - Image wird auf JPanel nicht angezeigt AWT, Swing, JavaFX & SWT 4
R JPanel paintComponents() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 5
A JPanel wird nach Buttonklick nicht angezeigt AWT, Swing, JavaFX & SWT 2
J 2D-Grafik JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 0
S Geladenes Bild wird nicht in JPanel angezeigt AWT, Swing, JavaFX & SWT 7
K JPanel wird nicht gezeichnet AWT, Swing, JavaFX & SWT 4
S Swing JLabel wird in JPanel nicht sichtbar AWT, Swing, JavaFX & SWT 2
R Instanz einer Subklsse von JPanel wird nicht angezeigt. AWT, Swing, JavaFX & SWT 15
H Swing JPanel Inhalt wird bei verwenden von JPopup gelöscht AWT, Swing, JavaFX & SWT 5
N Swing JPanel wird überschrieben AWT, Swing, JavaFX & SWT 2
H Swing paint() von JPanel wird nicht aufgerufen AWT, Swing, JavaFX & SWT 10
W JMenu wird vom JPanel ständig überzeichnet... Abhilfe? AWT, Swing, JavaFX & SWT 3
Ä Graphics-Komponente auf JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
V Bild wird nicht auf JPanel gezeichnet; Java Problem AWT, Swing, JavaFX & SWT 10
T grafik in jpanel wird nicht neugezeichnet AWT, Swing, JavaFX & SWT 7
E Problem mit JPanel - Wann wird size berechnet? AWT, Swing, JavaFX & SWT 5
P Zwei JPanel übereianderlegen AWT, Swing, JavaFX & SWT 14
XWing Basic JPanel mit 2 Buttons beutzen. AWT, Swing, JavaFX & SWT 10
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
M clear JPanel before repainting AWT, Swing, JavaFX & SWT 1
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
T Swing Reload JPanel + darin liegende ProgressBar AWT, Swing, JavaFX & SWT 9
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
Ich lerne Java. Swing Von JPanel A auf JPanel B zugreifen. AWT, Swing, JavaFX & SWT 4
A JPanel austauschen und Focus geben AWT, Swing, JavaFX & SWT 3
E Auf JPanel malen und davor JComponenten anzeigen AWT, Swing, JavaFX & SWT 12
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
B Verschiebbares JPanel "ruckelt" im Randbereich AWT, Swing, JavaFX & SWT 2
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
L JPanel zeigt keinen Inhalt AWT, Swing, JavaFX & SWT 1
dereki2000 JPanel mit Rückgbe wie bei JOptionPane AWT, Swing, JavaFX & SWT 3
E Hintergrundfarbe setzen in JPanel funktioneirt nicht AWT, Swing, JavaFX & SWT 4
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
L Swing JPanel Größe anpassen AWT, Swing, JavaFX & SWT 6
D Platzierung von JTextfield in JPanel AWT, Swing, JavaFX & SWT 3
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
M Zwei JPanel übereinander nur vorderes "repainten" AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
M Swing JPanel flüssig verschieben AWT, Swing, JavaFX & SWT 5
kilopack15 JPanel im laufenden Zustand einfärben AWT, Swing, JavaFX & SWT 2
kilopack15 JPanel Farbverwaltung AWT, Swing, JavaFX & SWT 1
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
A Swing JLabels in einer ForEach Schleife an den JPanel anheften (UNO Netzwerkspiel) AWT, Swing, JavaFX & SWT 1
L JPanel zeichnet im Konstrukter erzeugten Hintergrund nicht AWT, Swing, JavaFX & SWT 10
Java_RY wie kann ich auf JButtons in einem JPanel zugreifen AWT, Swing, JavaFX & SWT 3
F Zeichnung einem JPanel im Layoutmanager zuweisen AWT, Swing, JavaFX & SWT 3
Meeresgott Swing Umgang mit JPanel AWT, Swing, JavaFX & SWT 4
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
K JPanel Bilder bei Windows nicht darstellbar AWT, Swing, JavaFX & SWT 6
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
J Swing Zeichenfläche im JPanel des Haupfenster anzeigen lassen AWT, Swing, JavaFX & SWT 4
A Swing JPanel zeigt Buttons nicht an AWT, Swing, JavaFX & SWT 4
R JPanel überzeichnet alles? AWT, Swing, JavaFX & SWT 1
D Von JPanel auf anderes JPanel zugreifen AWT, Swing, JavaFX & SWT 9
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
I JPanel - Verwaltung/ Anordnung AWT, Swing, JavaFX & SWT 4
T JComponents zur Laufzeit auf JPanel darstellen AWT, Swing, JavaFX & SWT 10
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
M Swing JPanel innerhalb eines Frames verschieben AWT, Swing, JavaFX & SWT 3
K Swing JPanel ueber komplette Form legen AWT, Swing, JavaFX & SWT 1
W Swing Größenänderung vom JPanel im JScrollPane und anschließendes positionieren AWT, Swing, JavaFX & SWT 2
R Komponenten von JPanel bleiben unsichtbar AWT, Swing, JavaFX & SWT 2
O JTabeddpane aber jedes JPanel als eigene Klasse anlegen AWT, Swing, JavaFX & SWT 7
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
I (JPanel) paintComponent mit Zeitverschiebung (Sleep/Wait) AWT, Swing, JavaFX & SWT 1
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
S jpanel anchor bottom AWT, Swing, JavaFX & SWT 1
A JPanel größe verändern AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben