Wieso wird eine Zahl nicht innerhalb von einem JLabel ausgegeben?

1 Antwort

Wieso fügst du die Labels nicht dem Panel zu (und dieses dann dem Frame)?

JPanel board = new JPanel(new GridLayout(9, 9));

// inside inner loop:
board.add(label[x]);

// outside
frame.add(board);

Der Aufruf von setBounds fliegt in dem Zuge auch gleich raus, denn er wird nicht benötigt. Nutze durchweg nur Layout Manager.

Es gibt noch ein paar andere Punkte, die ich an deiner Stelle ändern würde.

1) Meide Umlaute / Sonderzeichen in Bezeichnern (Bsp.: SudokuLösung), nutze nur eine Sprache (Englisch / Deutsch) und bleibe eindeutig (z.B. board statt p, labels statt label)

2) Vermeide es, an vielen unterschiedlichen Stellen konkrete Werte im Code zu setzen, die ebenso durch Konstanten vertreten oder berechnet werden könnten. Hierfür gibt es verschiedene Beispiele:

So lassen sich die Größe des Frames, die Ausmaße des GridLayouts und die Länge des JLabel-Arrays jeweils berechnen. Die gemeinsame Basis ist doch stets die 9.

final int COLUMNS = 9;
final int ROWS = 9;

// ...
frame.setSize(COLUMNS * 100, ROWS * 100);
// ...
JPanel board = new JPanel(new GridLayout(COLUMNS, ROWS));
JLabel[] label = new JLabel[COLUMNS * ROWS];

for (int y = 0; y < ROWS; y++) { 
  for (int x = 0; x < COLUMNS; x++) {
    // ...

Alternativ könnte man auch die Länge des sudoku-Arrays verwenden. Hauptsache, die Reihen und Spalten werden möglichst nur einmal festgelegt. Wenn sich der Wert nämlich aus irgendeinem Grund später einmal ändern sollte, brauchst du ihn nur an einer Stelle ändern, statt an mehreren verschiedenen Orten.


Vedant12 
Fragesteller
 29.12.2019, 18:18

Erst einmal vielen Dank.

Ich habe jedoch noch eine Frage: Wie kann ich nun die Größe von "board" verändern?

0
regex9  29.12.2019, 18:36
@Vedant12

Setze für den Frame das FlowLayout. Dem Panel kannst du dann eine bevorzugte Größe zuordnen (setPreferredSize).

0
Vedant12 
Fragesteller
 29.12.2019, 18:52
@regex9

Danke, es hat geklappt.

Eine letzte Frage noch, bei mir funktioniert der EXIT_ON_CLOSE Befehl nicht, bzw. es wird ein Fehler angezeigt. Weißt du, woran das liegen könnte?

0
regex9  29.12.2019, 18:57
@Vedant12

Das ist eine Konstante.

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
0
Vedant12 
Fragesteller
 29.12.2019, 19:15
@regex9

ich hatte es genauso eingesetzt, jedoch wird da ein Fehler angezeigt

0
Vedant12 
Fragesteller
 29.12.2019, 19:16
@regex9

mir wird vorgeschlagen, es so einzugeben:

((JFrame) frame).setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

0