Я работаю над сложным проектом 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();
}
}
}
?. _ "есть ли способ проверить, что все вызовы всех компонентов 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() должен возвращать (каждый раз и навсегда) желаемый Rectangle – mKorbel
Можете ли вы добавить код, который вы используя для установки размера JFrame. – Ankit