我正在處理複雜的Java swing項目。在初始化期間,我將幀大小設置爲1280X1024。 有時,當我啓動我的應用程序時,幀的實際尺寸爲1282X1053(始終爲此尺寸),其他時候的幀開始於預期尺寸 。在運行時無意中發生JFrame大小變化
我有兩個問題,同時試圖找出問題的根源。
1)有沒有辦法在幀尺寸改變時設置觀察點? 我正在使用eclipse,並且當我嘗試設置一個觀察點時,它會在每個組件的大小發生更改時中斷。這是不可接受的,因爲我手動關注的組件過多。 2)由於這個問題不會每次都重現,所以我擔心可能在代碼的某處我訪問EDT之外的Java swing組件。有沒有一種方法可以驗證我的代碼中所有揮杆組件的調用都是從EDT完成的?
編輯: 下面的代碼是我使用的示例。
我不能附加代碼來構建面板,因爲它太複雜,不適合在這裏
編輯2:下面的代碼工作。問題發生在調用setVisible之前,因爲註釋行
package com.earlysense.nursestation;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class MyFrame extends JFrame {
private JPanel west;
private JPanel center;
/**
* Initializes the panels
*/
public void init() {
setLocation(0, 0);
setPreferredSize(new Dimension(1280, 1024));
setUndecorated(true); // The frame is fixed. It cannot be moved or resized.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = new JPanel(new BorderLayout());
west = new JPanel();
west.add(new JLabel("west"));
center = new JPanel();
center.add(new JLabel("center"));
p.add(BorderLayout.WEST, west);
p.add(BorderLayout.CENTER, center);
getContentPane().add(p);
}
public static void main(String[] args) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
MyFrame frame = new MyFrame();
frame.init();
frame.pack();
// at this point frame.getSize() returns 1280X1024
// add components to west and center panel which depends on the frame size to set self size
frame.setVisible(true);
// at this point frame.getSize() sometimes returns 1282X1053
}
});
} catch (InterruptedException e) {/* Do nothing */
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
? _「是否有一種方法可以驗證我的代碼中所有swing組件的調用都是從EDT完成的?」__ [''SWingUtilities.isEventDispatchThread()'](http://docs.oracle.com/javase /7/docs/api/javax/swing/SwingUtilities.html#isEventDispatchThread%28%29) –
這個問題並不是很有趣,在應用程序啓動時不需要測試EDT,更多內容請參見[參見最初線程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial .html),它必須在那裏使用....,注意避免硬編碼設置(Xxx)大小,然後JFrame.pack()必須退回(每次和永遠)所需的矩形 – mKorbel
你可以添加代碼,你是用於設置JFrame的大小。 – Ankit