2010-08-11 3 views
1

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

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

Когда я скопировал бен-папку со всеми файлами классов и попытался запустить программу в 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()); 
    } 
} 

Заранее благодарен!

ответ

5

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

+0

Большое спасибо! Я переместил «Border blackline = BorderFactory.createLineBorder (Color.black), setBorder (черная линия)»; к конструктору, и теперь он работает! Но почему он не работал, прежде чем я это сделал? Я понимаю, конечно, что нет необходимости устанавливать границу каждый раз, когда компонент окрашивается, но я не могу понять, как это может вызвать такие проблемы .. – Greensea

+1

@Greensea Это изменит смещения и предположительно сделает недействительным макет вверх по дереву компонентов. Я думаю, что можно с уверенностью сказать, что в этот момент все ставки прекратились. –

+0

А, я думаю, теперь я понимаю. Я думал, что setBorder() заменил старую границу на новую, но, очевидно, это не так, как работает метод. Спасибо за помощь! – Greensea

2

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

super.paintComponent(g); 

наверху метода.

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