Я строю игру Tic Tac Toe на Java с графическим интерфейсом Swing, и она правильно отображается в Ubuntu 10.4 и Windows XP. Вот как это выглядит в Ubuntu:Java - Swing GUI неправильно отображается в Windows 7
Когда я скопировал бен-папку со всеми файлами классов и попытался запустить программу в 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());
}
}
Заранее благодарен!
Большое спасибо! Я переместил «Border blackline = BorderFactory.createLineBorder (Color.black), setBorder (черная линия)»; к конструктору, и теперь он работает! Но почему он не работал, прежде чем я это сделал? Я понимаю, конечно, что нет необходимости устанавливать границу каждый раз, когда компонент окрашивается, но я не могу понять, как это может вызвать такие проблемы .. – Greensea
@Greensea Это изменит смещения и предположительно сделает недействительным макет вверх по дереву компонентов. Я думаю, что можно с уверенностью сказать, что в этот момент все ставки прекратились. –
А, я думаю, теперь я понимаю. Я думал, что setBorder() заменил старую границу на новую, но, очевидно, это не так, как работает метод. Спасибо за помощь! – Greensea