2010-11-02 4 views
2

Итак, я начал разрабатывать графический интерфейс TicTacToe в Java & Я застрял.Некоторые проблемы при проектировании графического интерфейса

Вот код, я работаю над

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

public class gameWindow { 
int b; 
JFrame frameX; 
JPanel panel1, panel2, panel3, panel4; 
JLabel[] labelX = new JLabel[10]; 
JTextField inputter; 
JButton input; 
JButton exit; 
public static void main(String[] args) { 
    gameWindow xyz = new gameWindow(); 
    xyz.go(); 
} 

public void go() { 
    frameX = new JFrame(); 
    //frameX.setResizable(false); 
    LayoutManager lay1 = new BoxLayout(panel1, BoxLayout.X_AXIS); 
    LayoutManager lay2 = new BoxLayout(panel2, BoxLayout.X_AXIS); 
    LayoutManager lay3 = new BoxLayout(panel3, BoxLayout.X_AXIS); 
    panel1 = new JPanel(/*lay1*/); 
    panel2 = new JPanel(/*lay2*/); 
    panel3 = new JPanel(/*lay3*/); 
    panel4 = new JPanel(); 
    // 
    for (b=1; b<10; b++) { 
     labelX[b] = new JLabel(); 
    } 
    // 
    inputter = new JTextField(); 
    input = new JButton(); 
    exit = new JButton(); 
    frameX.setSize(300,300); 
    frameX.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frameX.setVisible(true); 
    // 
    for(b=1; b<10; b++) { 
     labelX[b].setForeground(Color.BLUE); 
     labelX[b].setPreferredSize(new Dimension(50,50)); 
     labelX[b].setText("X"); 
     if (b<4) { 
      panel1.add(labelX[b]); 
     } else if(b>3 && b<7) { 
      panel2.add(labelX[b]); 
     } else if(b>6) { 
      panel3.add(labelX[b]); 
     } 
    } 
    // 
    inputter.setPreferredSize(new Dimension(50,50)); 
    inputter.setText("Enter box number here"); 
    input.setPreferredSize(new Dimension(50,50)); 
    input.setText("Play"); 
    exit.setPreferredSize(new Dimension(50,50)); 
    exit.setText("Exit"); 
    exit.addActionListener(new forExit()); 
    panel4.add(inputter); 
    panel4.add(input); 
    panel4.add(exit); 
    //Adding Panels to the frame 
    frameX.getContentPane().add(BorderLayout.NORTH, panel1); 
    frameX.getContentPane().add(BorderLayout.CENTER, panel2); 
    frameX.getContentPane().add(BorderLayout.SOUTH, panel3); 
    frameX.getContentPane().add(BorderLayout.EAST, panel4); 
} 

class forExit implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     System.exit(0); 
    } 
    } 
} 

1) Первая проблема, которую я получаю, что всякий раз, когда я компилирую & запустить этот, ни один компонент не отображается на JFrame. Но тогда, если я максимизирую рамку, появятся все компоненты. Что это?

2) Если я раскомментировать lay1, lay2 & lay3 в объявлении JPanels использования (Layout) конструктор JPanel, я получаю BoxLayout can't be shared ошибки (выполнения) на кадре не появляется & ничего. В этом случае даже максимизация не помогает.

Что я делаю неправильно & У вас есть лучший способ создать графический интерфейс?

ответ

3

Для вашей первой проблемы установите статус видимости (frameX.setVisible(true);) после добавление всех компонентов внутри рамки. В других словах поместите эту строку в конце метода go.

Ваша проблема в том, что отображается JFrame, после чего вы меняете его содержимое. Таким образом, кадр должен быть обновлен, чтобы отображаться с его новым контентом. Если после добавления содержимого вы установите статус видимости на true, эта проблема не будет решена.

Что касается вашей второй проблемы, я никогда не использую BoxLayout, но, возможно, вы можете взглянуть на this page, в котором объясняется, как ее использовать. В противном случае, возможно, вы можете рассмотреть возможность использования другого макета?

+2

Еще одна проблема заключается в том, что после того, как вы установилиVisible, вам абсолютно не разрешено изменять содержимое вашего фрейма в используемом вами потоке. Технически даже для того, что вы делаете, вы должны использовать invokeLater или что-то, чтобы попасть в поток AWT, прежде чем делать что-либо с фреймом, но я никогда не видел код с ошибкой, если вы его не модифицируете после его реализации (после setVisible (true)), однако Sun сказал, что отказ возможен, и что ВСЕ обновления swing должны быть в awt-потоке. –

+0

Получил это. Спасибо вам обоим. Но все же, что случилось с BoxLayout? – MoonStruckHorrors

0

BoxLayout действительно вызывает эти проблемы. Вы должны это сделать:

panel1 = new JPanel(); 
panel1.setLayout(lay1); 

Таким образом, проблема связана с тем, что вы делаете.

Когда вы сделаете эту строку:

LayoutManager lay1 = new BoxLayout(panel1, BoxLayout.X_AXIS); 

panel1 еще не инициализирована, так что нулевая. К сожалению, BoxLayout будет жаловаться на это. Чтобы решить эту проблему, вам необходимо:

panel1 = new JPanel(); 
panel2 = new JPanel(); 
panel3 = new JPanel(); 

LayoutManager lay1 = new BoxLayout(panel1, BoxLayout.X_AXIS); 
LayoutManager lay2 = new BoxLayout(panel2, BoxLayout.X_AXIS); 
LayoutManager lay3 = new BoxLayout(panel3, BoxLayout.X_AXIS); 

panel1.setLayout(lay1); 
panel2.setLayout(lay2); 
panel3.setLayout(lay3); 
+0

Нет, сэр, не помогло. :( – MoonStruckHorrors

+0

ОК. См. Мои правки выше. Это решает проблему, и программа работает сейчас. –

Смежные вопросы