2014-01-23 3 views
3

Я работаю над сложным проектом java swing. Во время инициализации я установил размер кадра 1280X1024. Иногда, когда я запускаю свое приложение, кадр начинается с ожидаемых размеров в других случаях размер кадра составляет 1282X1053 (всегда такого размера).Изменение размера JFrame непреднамеренно во время выполнения

У меня есть два вопроса, пытаясь определить источник этой проблемы.

1) есть ли способ установить точку наблюдения при изменении размера рамки? Я использую eclipse, и когда я пытался установить точку наблюдения, он ломается, когда каждый компонент меняет размер. это неприемлемо, поскольку у меня слишком много компонентов для ручного следования.

2) из-за того, что проблема не воспроизводится каждый раз, я беспокоюсь, что, возможно, где-то в коде я обращаюсь к компоненту Java swing вне EDT. есть ли способ проверить, что все вызовы всех компонентов swing в моем коде сделаны из EDT?

EDIT: приведенный ниже код является образцом того, что я использую.
Я не могу прикрепить код для сборки панелей, поскольку он слишком сложный для установки здесь

EDIT 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() должен возвращать (каждый раз и навсегда) желаемый Rectangle – mKorbel

+0

Можете ли вы добавить код, который вы используя для установки размера JFrame. – Ankit

ответ

2

Похоже, что ошибка в Java. был известен в java 1.3, но, по-видимому, все еще случается. Я использую Ubuntu 13.10 64bit, JDK: OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu2.1) link

-1

Я установил размер кадра 1280х1024.

Почему? Мой экран 1024 x 768, поэтому, я думаю, я не могу использовать ваше приложение? Не указывайте значения жесткого кода. Вместо того, чтобы использовать:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

SwingUtilities.invokeAndWait (новый Runnable() {

Почему вы используете invokdeAndWait Все качели учебник и предложения людей в использовании форума invokeLater(..)

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