2016-04-17 9 views
0

Kann mir jemand sagen, warum nach Aufruf der Methode getContentPane(). Add (grid [i] [j]) Ich kann die Matrix von JLabels nicht anzeigen. Es wird nur ein "e" -Label angezeigt.Anzeige der JLabel-Matrix

public class SudokuFrame erweitert JFrame implements Action {

JButton generateButton; 
JLabel[][] grid; 

public SudokuFrame(){ 
    setSize(300, 300); 
    setTitle("Sudoku"); 
    setLayout(null); 
    generateButton = new JButton("Generate"); 
    generateButton.setBounds(90, 220, 100, 30); 
    add(generateButton); 
    generateButton.addActionListener(this); 

    grid = new JLabel[9][9]; 
    for (int i = 0; i < 9; i++) { 
     for (int j = 0; j < 9; j++) { 
      grid[i][j] = new JLabel("e"); 
      grid[i][j].setBounds(100, 100, 30, 30); 
      getContentPane().add(grid[i][j]); 
     } 
    } 
} 

public static void main(String[] args){ 
    SudokuFrame frame = new SudokuFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 

Antwort

4

Sie jeden JLabel die exakt die gleichen Grenzen geben - gleiche Größe und die gleiche Position und so jedes neue Etikett wird direkt Klecks auf schmatzen platziert der zuvor hinzugefügten.

Lösung: Verwenden Sie kein Null-Layout. Warum sollte man das verwenden, wenn das Problem für ein GridLayout perfekt geeignet ist? Im Allgemeinen möchten Sie die Verwendung von Null-Layouts und setBounds vermeiden, da die Layout-Manager Ihre Programmierung und Ihre GUI viel einfacher zu verwalten machen. Lassen Sie die Layouts das schwere Heben für Sie erledigen.

zB

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.GridLayout; 
import javax.swing.*; 

public class SimpleSudoku extends JPanel { 
    private static final int GAP = 1; 
    private static final Font LABEL_FONT = new Font(Font.DIALOG, Font.PLAIN, 24); 
    private JLabel[][] grid = new JLabel[9][9]; 

    public SimpleSudoku() { 
     JPanel sudokuPanel = new JPanel(new GridLayout(9, 9, GAP, GAP)); 
     sudokuPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP)); 
     sudokuPanel.setBackground(Color.BLACK); 
     for (int row = 0; row < grid.length; row++) { 
      for (int col = 0; col < grid[row].length; col++) { 
       grid[row][col] = new JLabel("  ", SwingConstants.CENTER); 
       grid[row][col].setFont(LABEL_FONT); // make it big 
       grid[row][col].setOpaque(true); 
       grid[row][col].setBackground(Color.WHITE); 
       sudokuPanel.add(grid[row][col]); 
      } 
     } 

     JPanel bottomPanel = new JPanel(); 
     bottomPanel.add(new JButton("Regenerate")); 

     setLayout(new BorderLayout()); 
     add(sudokuPanel, BorderLayout.CENTER); 
     add(bottomPanel, BorderLayout.PAGE_END); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 

    private static void createAndShowGui() { 
     SimpleSudoku mainPanel = new SimpleSudoku(); 
     JFrame frame = new JFrame("SimpleSudoku"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 
} 
+1

(1+) Lesen Sie den Abschnitt aus den Swing-Tutorial auf [Wie Gridlayout verwendet] (http://docs.oracle.com/javase/tutorial/uiswing/layout/grid .html) für Arbeitsbeispiele. Die Beispiele zeigen auch eine bessere Möglichkeit, Ihre GUI zu erstellen und den Code so zu strukturieren, dass die Komponenten im Ereignis-Dispatch-Thread erstellt werden. Halten Sie einen Link zum Tutorial bereit, da es Beispiele für alle Swing-Grundlagen enthält. – camickr

+0

Layouts, Layouts, Layouts +1 – MadProgrammer