2014-01-23 58 views
3

我正在處理複雜的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(); 
     } 
    } 
} 
+0

? _「是否有一種方法可以驗證我的代碼中所有swing組件的調用都是從EDT完成的?」__ [''SWingUtilities.isEventDispatchThread()'](http://docs.oracle.com/javase /7/docs/api/javax/swing/SwingUtilities.html#isEventDispatchThread%28%29) –

+1

這個問題並不是很有趣,在應用程序啓動時不需要測試EDT,更多內容請參見[參見最初線程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial .html),它必須在那裏使用....,注意避免硬編碼設置(Xxx)大小,然後JFrame.pack()必須退回(每次和永遠)所需的矩形 – mKorbel

+0

你可以添加代碼,你是用於設置JFrame的大小。 – Ankit

回答

2

這似乎是一個在java中的錯誤。在java 1.3中已經知道了 ,但顯然還是會發生。我使用的ubuntu 13.10 64位,JDK:OpenJDK的運行時環境(1.12.6 IcedTea6)(6b27-1.12.6-1ubuntu2.1) link

-1

我設置幀大小爲1280x1024。

爲什麼?我的屏幕是1024 x 768,所以我想我不能使用你的應用程序?不要硬編碼值。而是使用:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

SwingUtilities.invokeAndWait(新的Runnable(){

爲什麼你在論壇中使用使用invokdeAndWait所有Swing指南和建議的人invokeLater(..)

相關問題