Медленное рисование модальных диалогов в Java после установки местоположения экрана-центра в Java SwingJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Медленное рисование модальных диалогов в Java после установки местоположения экрана-центра в Java Swing

Сообщение Anonymous »

Репост: я работаю над Java-приложением, которое позволяет пользователям «детализировать» элементы в диалоговом окне — выводить одно модальное диалоговое окно поверх другого и располагать их по центру экрана. Но если я быстро углубляюсь, нажимая клавишу Enter, то к тому времени, как я доберусь до третьего диалогового окна, его отрисовка займет целую вечность — иногда пару секунд.
Нарушающий код, похоже, заключается в центрировании экрана, что я делаю следующим образом:
setLocationRelativeTo(null);

Я комментирую эту строку, и диалоговые окна рисуются мгновенно. Это также мгновенно, если я установлю местоположение следующим образом:
setLocation(300,400);

Может ли кто-нибудь объяснить, что происходит, и есть ли способ обойти эту задержку?
Ниже приведен пример кода, который создает проблему. Примечание. Я добавил пару прослушивателей для измерения времени между нажатием клавиши Enter и моментом отображения следующего диалогового окна и моментом, когда его JTextField получает фокус. Интересно, что они дают мне значения в десятках миллисекунд — намного меньше, чем задержка, которую я наблюдаю.
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class DialogTestFrame extends JFrame {

public DialogTestFrame() {
super("Screen Center Demo");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Create a JPanel with a JTextField in it
JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
JTextField textField = new JTextField(20);
final DialogTestFrame1 frame = this;
textField.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent evt) {
if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
evt.consume();
long start = System.currentTimeMillis();
DialogTestDialog1 d = new DialogTestDialog1(frame);
showDialog(d, 1, start);
}
}
});
panel.add(textField);
add(panel);

// Center the dialog
setLocationRelativeTo(null);
}

public class DialogTestDialog1 extends JDialog {

public DialogTestDialog1(Frame parent) {
super(parent, true);
}
}

public class DialogTestDialog2 extends JDialog {

public DialogTestDialog2(JDialog parent) {
super(parent, true);
}
}

public class DialogTestDialog3 extends JDialog {

public DialogTestDialog3(JDialog parent) {
super(parent, true);
}
}

public void showDialog(JDialog dlg, int level, long start) {
// Create a 900x500 dialog
dlg.setSize(900, 500);
dlg.setTitle("Level " + level);

// Create JPanel and text field
JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
JTextField textField = new JTextField(20);

// Create JButton and add textfield
// Listen for Escape and Enter
textField.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent evt) {
long start = System.currentTimeMillis();
if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) {
dlg.dispose();
} else if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
switch (level) {
case 1 -> {
evt.consume();
DialogTestDialog2 d = new DialogTestDialog2(dlg);
showDialog(d, 2, start);
}
case 2 -> {
evt.consume();
DialogTestDialog3 d = new DialogTestDialog3(dlg);
showDialog(d, 3, start);
}
case 3 -> {
}
}
}
}
});

// Listen for when it gets focus
textField.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
System.out.printf("Dialog %d focus gained in %d milliseconds\n", level, (System.currentTimeMillis() - start));
}
});
panel.add(textField);
dlg.add(panel);

// Listen for dialog opening/showing
dlg.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
System.out.printf("Dialog %d opened in %d milliseconds\n", level, (System.currentTimeMillis() - start));
}
});
dlg.addComponentListener(new ComponentAdapter() {
@Override
public void componentShown(ComponentEvent e) {
System.out.printf("Dialog %d shown in %d milliseconds\n", level, (System.currentTimeMillis() - start));
}
});

// Set to screen centert
dlg.setLocationRelativeTo(null);
dlg.setVisible(true);
}

public static void main(String[] args) {
(new DialogTestFrame1()).setVisible(true);
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... enter-in-j
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»