2013-05-20 5 views
0

Я работаю над программой Java, которая решает головоломки судоку. Пока все, что я закодировал, это класс, который рисует доску с помощью swing, и еще один класс, который вызывает класс gui.Swing gui не отображается, но ошибок нет?

Когда я пытаюсь запустить программу, ничего не происходит. Сообщения об ошибках не отображаются, но gui также не отображается. Он немедленно прекращается.

Вот мой код до сих пор:

класс Gui:

package sudoku; 

import java.awt.*; 
import javax.swing.*; 

public class Gui { 

    Gui gui; 
    JPanel board; 
    JPanel subBoard[][]; 
    GridLayout layout; 
    JLabel square[][]; 

    public void load() { 

     gui = new Gui(); 
     gui.setUp(); 
     gui.buildBoard(); 

    } 

    private void setUp() { 

     layout = new GridLayout(3, 3); 
     board = new JPanel(layout); 
     subBoard = new JPanel[3][3]; 
     square = new JLabel[9][9]; 

    } 

    private void buildBoard() { 

     // set up board 
     board.setSize(800, 600); 
     board.setVisible(true); 

     int mod = 0; 
     for (int i = 0; i < 3; i++) { 
      for (int j = 0; j < 3; j++) { 

       // add subBoards to board 
       subBoard[i][j] = new JPanel(); 
       board.add(subBoard[i][j]); 
       subBoard[i][j].setLayout(layout); 
       subBoard[i][j].setVisible(true); 

       // add textfields to each subBoard 
       square[i + mod][j + mod] = new JLabel(); 
       subBoard[i][j].add(square[i + mod][j + mod]); 
       square[i + mod][j + mod].setVisible(true); 

      } 
      mod += 3; 

     } 
    } 

} 

главный класс:

package sudoku; 

public class SudokuSolver { 

    public static void main(String[] args) { 

     Gui gui = new Gui(); 
     gui.load(); 

    } 

} 

Я попытался запустить его в оба затмения и NetBeans, но получил тот же результат, как раз. Почему это не работает?

+6

У вас есть класс 'Gui', который имеет член типа' Gui'? У меня болит голова. – splungebob

+0

Вам нужно пройти учебники, так как они скажут вам, что вам нужно отображать компоненты в контейнере верхнего уровня. Там все объяснено. Обратите внимание: теперь хорошо знать, что ошибки компилятора и исключения во время выполнения не означают, что ошибок в логике нет. –

ответ

5

В приложении не отображается отображаемое окно, например JFrame.

EventQueue.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     JFrame frame = new JFrame("New GUI"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Gui gui = new Gui(); 
     gui.load(); 
     frame.add(gui.getBoard()); // add getBoard getter 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
}); 

Удалить переменную-член класса gui в Gui. Это затенение переменных во внешнем классе Gui, поэтому используйте последнее. Также переопределите getPreferredSize, чтобы дать размер board, когда вызывается frame.pack().

+0

Почему 'frame.add (gui.getBoard());', а не 'frame.setContentPane (gui.getBoard())'; ? –

+0

Добавление панели в 'BorderLayout.CENTER' сделает ее занятой полной клиентской областью, так как нет других добавленных компонентов. – Reimeus

+0

Не имеет ли' JFrame' 'FlowLayout' по умолчанию? Я не спорю - просто пытаюсь понять. –

2

Марка GUI удлинить JFrame во-первых. Затем в основном методе вызывается gui.setVisible(true);.

public class Gui extends JFrame { } 

Тогда в главном.

Gui gui = new Gui(); 
gui.load(); 
gui.setVisible(true); 
+0

и 'board' должны быть обозначены как' content pane' для фрейма 'gui'. –

+1

Обычно не рекомендуется распространяться непосредственно из контейнера верхнего уровня, если вы вообще можете его избежать. Лучше расшириться от чего-то вроде «JPanel», который предоставляет вам гибкость в использовании компонента любым способом, который вы хотите ... добавьте его в JFrame, JWindow, JApplet или добавьте его как часть уже существующий пользовательский интерфейс – MadProgrammer

0

Вы не можете напрямую показать Jpanel. для show gui вы должны использовать JFrame или любой другой класс Window (JDialog, JWindow ...) и после этого установить видимое свойство true.

setVisible (true);

public class Gui extends JFrame { 
     Gui(){ 
      ... 
      setVisible(true); 
      setSize(300,400); 
     } 
     ... 
}