Некоторые проблемы проектирования графического интерфейса - PullRequest
2 голосов
/ 02 ноября 2010

Итак, я начал разрабатывать графический интерфейс 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, чтобы использовать конструктор JPanel (Layout), я получаю ошибку BoxLayout can't be shared (время выполнения), и на кадре ничего не появляется.В этом случае даже максимизация не помогает.

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

Ответы [ 2 ]

3 голосов
/ 02 ноября 2010

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

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

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

0 голосов
/ 02 ноября 2010

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...