Java - графический интерфейс Swing некорректно отображается в Windows 7 - PullRequest
1 голос
/ 12 августа 2010

Я создаю игру Tic Tac Toe на Java с графическим интерфейсом Swing, и она корректно отображается в Ubuntu 10.4 и Windows XP. Вот как это выглядит в Ubuntu:

http://img266.imageshack.us/img266/2432/tictactoe2.png http://img266.imageshack.us/img266/2432/tictactoe2.png

Когда я скопировал папку bin со всеми файлами классов и попытался запустить программу в Windows 7, она выглядела так:

img413.imageshack.us / img413 / 6144 / tictactoe1.gif http://img413.imageshack.us/img413/6144/tictactoe1.gif
img708.imageshack.us / img708 / 4387 / tictactoe2.gif http://img708.imageshack.us/img708/4387/tictactoe2.gif

Я просто не могу понять, что не так. Как я уже сказал, он отлично работает в Ubuntu 10.4 и Windows XP.

Я был бы очень рад, если бы кто-нибудь мог мне помочь! Я опубликую код, связанный с графическим интерфейсом, на всякий случай, если это необходимо для решения проблемы.

Вот код, который я использую для инициализации GUI:

//Initializing GUI.
    frame = new JFrame();  //Creating the window.
    frame.setTitle("Tic Tac Toe"); //Setting the title of the window.
    frame.addMouseListener(this);
    frame.getContentPane().add(BorderLayout.CENTER, grid.getPanel());  //Adding the grid panel.
    info = new JLabel(" Initializing game...");         //Creating info text.
    frame.getContentPane().add(BorderLayout.SOUTH, info);  //Adding info text.

    //Setting GUI properties.
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300, 300);
    frame.setVisible(true);

Панель с самой сеткой создается в моем классе GameGrid, у которого есть метод "JPanel getPanel ()". Вот инициализация этой панели (код принадлежит конструктору GameGrid):

     GridBox temp;
    layout = new GridLayout(getHeight(), getWidth());
    panel = new JPanel(layout);
    panel.setBorder(
        BorderFactory.createCompoundBorder(
                BorderFactory.createTitledBorder("Click in a box to place a marker:"),
                    BorderFactory.createEmptyBorder(5,5,5,5)));

    //Creating a GridBox for each cell, and adding them to the panel in the right order..
    for(int i = 0; i < getHeight(); i++) {    
        for(int j = 0; j < getWidth(); j++) {
            temp = new GridBox(j, i);
            temp.addMouseListener(listener);
            panel.add(temp);
        }
    }

GridBox - это подкласс JPanel, который я изменил, чтобы автоматически показывать содержимое сетки в указанных координатах.

class GridBox extends JPanel {
    private static final long serialVersionUID = 1L;
    int fontsize, x, y, value, signHeight, signWidth;
    char print;
    FontMetrics fm;
    LineMetrics lm;

    public GridBox(int a, int b) {
        x = a;     //TODO - input control
        y = b;
    }

    public Move getMove() {
        Move m = new Move(x, y);
        return m;
    }


    public void paintComponent(Graphics g) {
        Border blackline = BorderFactory.createLineBorder(Color.black);
        setBorder(blackline);
        Dimension size = getSize();
        Rectangle2D rect;
        fontsize = (int)(size.getHeight()*0.75);
        value = getGridValue(x, y);
        if(value == EMPTY)
            print = ' ';
        else if(value == 0)
            print = 'X';
        else if(value == 1)
            print = 'O';
        else
            print = (char)value;


        Font font = new Font("Times New Roman", Font.PLAIN, fontsize);
        g.setFont(font);
        fm = g.getFontMetrics();
        rect = fm.getStringBounds(Character.toString(print), g);
        signHeight = (int)rect.getHeight();
        signWidth = (int)rect.getWidth();


        g.setColor(Color.black);
        g.drawString(Character.toString(print), (size.width/2)-(signWidth/2), (size.height/2)-(signHeight/2)+fm.getAscent());
    }
}

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 12 августа 2010

Существует очевидная проблема, связанная с изменением границы при перерисовке компонента. Это вызовет всевозможные проблемы.

2 голосов
/ 12 августа 2010

Кроме того, я не вижу, где вы рисуете фон панели. Вы должны иметь

super.paintComponent(g);

в начале метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...