Репост: я работаю над 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
Медленное рисование модальных диалогов в Java после установки местоположения экрана-центра в Java Swing ⇐ JAVA
Программисты JAVA общаются здесь
1770756407
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);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79885362/java-sluggish-drawing-of-modal-dialogs-after-setting-location-screen-center-in-j[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия