Wieso wird eine Zahl nicht innerhalb von einem JLabel ausgegeben?
Hallo,
ich arbeite gerade an einem Sudoku-Projekt. Ich habe das zweidimensionale Array ([9][9]) sudoku bereits berechnet und möchte nun dieses Array in einem JFrame ausgeben.
Doch komischerweise wird die letzte Zahl von dem Array nicht wie vorgesehen in einem JLabel mit einem schwarzen Rand ausgegeben, sondern die Zahl ist ganz woanders und hat keinen Rand. Woran liegt das?
public class SudokuLösung extends JFrame {
public static void main(String args[]) {
Frame frame = new JFrame("Sudoku");
frame.setSize(900, 900);
int width = 40;
int height = width;
JPanel p = new JPanel(new GridLayout(9, 9));
JLabel[] label = new JLabel[81];
for (int y = 0; y < 9; y++) {
for (int x = 0; x < sudoku.length; x++) {
int zahl = sudoku[y][x];
label[x] = new JLabel();
label[x].setBounds((width * x)+ 200, (height * y) + 50, width, height);
label[x].setBorder(BorderFactory.createLineBorder(Color.black));
label[x].setText(String.valueOf(zahl));
label[x].setVerticalAlignment(SwingConstants.CENTER);
label[x].setHorizontalAlignment(SwingConstants.CENTER);
frame.add(label[x]);
}
}
frame.setResizable(false);
frame.setVisible(true);
}
}
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.
Erst einmal vielen Dank.
Ich habe jedoch noch eine Frage: Wie kann ich nun die Größe von "board" verändern?