我使用Eclipse IDE在運行OSX 10.7.5的Mac上開發。這個程序構造了一個JPanel數組,當用戶點擊一個面板時,同一行或列上的所有其他面板都會改變顏色,藍色表示鼠標左鍵,紅色表示右鍵。當我從IDE運行時,一切正常,至少我從來沒有見過它失敗。但是,當我創建一個.jar文件並通過雙擊運行時,大多數情況下它可以正常工作,但每隔一段時間它都不會更改其他某些面板的顏色。GUI更新在IDE中工作,但並不總是從jar文件中運行
要測試我選擇一個正方形,並交替地右鍵單擊並左鍵單擊它。正如我所說的大多數時候它工作的那樣,同一行或同一列中的所有其他面板都會改變顏色。但是,如果我右鍵點擊一個正方形,並且一些面板保持藍色,那就是失敗。如果我再次右擊同一方塊,它不會改變顯示;失敗的面板保持藍色。這就像經理認爲一切都是正確的顏色,並且不用更新顯示器。
如果我調整面板大小或用任一按鈕單擊任何其他方塊,所有面板都會翻轉到正確的顏色。此代碼沒有顯式調用repaint(),但我試過,並沒有解決問題。我試過閱讀重繪管理器,但還沒有找到讓顯示器可靠更新的方法。正如我所說,運行IDE時我從來沒有見過這種情況,並且大多數情況下它也可以作爲應用程序運行。剛纔,大約需要50次點擊才能失敗。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUITest extends JPanel {
final static int NROWS = 81;
final static int TOTAL_SQ = NROWS * NROWS;
Square[] square = new Square[TOTAL_SQ];
public GUITest() {
setLayout(new GridLayout(NROWS, NROWS));
for (int i = 0; i < TOTAL_SQ; i++) {
square[i] = new Square(i);
add(square[i]);
}
}
public void squareClicked(int id, int button) {
// determine which row and column
int row = id/NROWS;
int col = id % NROWS;
// change background color of all squares on same row or column
for (int i = 0; i < TOTAL_SQ; i++) {
if ((row == i/NROWS) || (col == i % NROWS))
if (button == MouseEvent.BUTTON3)
square[i].setBackground(Color.RED);
else
square[i].setBackground(Color.BLUE);
}
} // squareClicked
class Square extends JPanel implements MouseListener {
int id = 0; // which square this is
public Square(int id) {
this.id = id;
setBorder(BorderFactory.createLineBorder(Color.black));
addMouseListener(this);
} // Square constructor
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
squareClicked(id, e.getButton());
}
} // Square
public static void main(String[] args) {
JFrame frame = new JFrame("GUI Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GUITest app = new GUITest();
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
frame.getContentPane().add(app, BorderLayout.CENTER);
frame.setVisible(true);
}
}
我有第二個問題可能是相關的。 IDE顯示比應用程序快得多。 IDE在閃存中更新。應用程序逐個更新每個面板,但速度明顯較慢。我猜IDE是使用雙緩衝顯示器。我也閱讀了這些內容,但沒有看到如何在整個顯示屏準備就緒前暫停更新。
在此先感謝。
1)文字牆報警!使用段落。 2)*「我有第二個問題可能是相關的。」*整個文字不包含'?'所以......你的第一個問題是什麼? –