Полноэкранные кадры Swing неправильно фокусируются в Linux (в Windows все в порядке)

У меня есть приложение, которое создает несколько полноэкранных кадров без оформления (в основном контролируя все пространство экрана). Моя проблема в том, что некоторые кнопки на определенных кадрах предназначены для «переключения экранов», что в основном означает отображение другого кадра вместо текущего.

Я легко добился этого в Windows, используя это:

target.setVisible(true);
target.requestFocus();
this.parent.setVisible(false);

Где target — кадр, на который я переключаюсь. Это работает, потому что изначально я сделал невидимыми все кадры, кроме первого «основного» кадра.

Теперь, когда я переношу это в среду Linux, я получаю уродливое «мигание» при смене кадров. За эту долю секунды я могу увидеть фон своего рабочего стола и все открытые окна, которые существуют за моим приложением. У меня была эта проблема в Windows раньше, и я исправил ее, сфокусировав целевой кадр, прежде чем сделать старый невидимым.

Любые идеи о том, как решить эту проблему Linux?

редактировать:

setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setUndecorated(true);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(0,0,screenSize.width, screenSize.height);
this.getContentPane().setLayout(null);
setVisible(true);
validate();

person n0pe    schedule 12.07.2011    source источник
comment
пожалуйста, прочитайте [эту тему] [1] [1]: stackoverflow.com/questions/6586064/   -  person mKorbel    schedule 12.07.2011
comment
Спасибо, я посмотрю на это.   -  person n0pe    schedule 12.07.2011
comment
@mKorbel - не думаю, что это именно то, что я ищу. ОП имел дело с нажатиями клавиш, и его проблема не была точно такой же, как у меня.   -  person n0pe    schedule 13.07.2011
comment
что KeyStrokes связано с Focus, может быть, больше информации (действительно с незавершенным для всех возможных событий) stackoverflow.com/questions/309023/, или у OP есть проблема с установкой Focus на конкретный JComponents ???   -  person mKorbel    schedule 13.07.2011
comment
У меня есть полноэкранные кадры, которые рисуются непосредственно на видеокарте, а не в окнах. Проблема не в явном изменении фокуса на кадры, потому что я могу сделать это в среде Windows. Однако мой код не работает в Linux. Я спрашиваю, ПОЧЕМУ это не работает в Linux и КАК я могу не сделать это в Linux.   -  person n0pe    schedule 13.07.2011
comment
просто мне любопытно, какой API вы используете для этого OpenGL ???   -  person mKorbel    schedule 13.07.2011
comment
Java поддерживает его, поэтому нет необходимости в OpenGL. Посмотрите на мою правку, как я создаю кадры.   -  person n0pe    schedule 13.07.2011
comment
посмотри мой пост об этом, может я ошибаюсь...   -  person mKorbel    schedule 13.07.2011
comment
почему вы звоните validate(); после setVisible(true), нет причин вызывать Validate Container, это не имеет ничего общего с самым ленивым ответом, пожалуйста, возьмите код (автор @Andrew Thompson) 2nd. с ClassName ImageCacheTest stackoverflow. com/questions/6368160/, раскомментировать //halfScreenSize = new Dimension(d.width - 11, d.height - 51); а затем отключите halfScreenSize = new Dimension(d.width/2, d.height/2); , это очень тяжело для процессора и графического процессора, если мерцание, зависание ..., значит что-то не так внутри ПК/патч для ОС   -  person mKorbel    schedule 26.07.2011
comment
Вы пытались отложить parent.setVisible(false);, вставив SwingUtilities.invokeLater()? Это может помочь.   -  person jfpoilpret    schedule 27.07.2011
comment
О, я не подумал об этом. Я попробую. Спасибо   -  person n0pe    schedule 27.07.2011


Ответы (4)


target.requestFocus();

Из JavaDocs:

Обратите внимание, что использование этого метода не рекомендуется, поскольку его поведение зависит от платформы. Вместо этого мы рекомендуем использовать requestFocusInWindow(). Если вам нужна дополнительная информация о фокусе, см. Как использовать фокус Подсистема, раздел в Учебнике по Java.

person Andrew Thompson    schedule 29.07.2011

CardLayout может стать хорошей альтернативой одиночному кадру. Вы можете перемещаться с помощью поля со списком или кнопки или оба.

Обновление: этот пример не вызывает прошить на Ubuntu 10.04.3 LTS с версией Java 1.6.0_20.

person trashgod    schedule 12.07.2011

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

1/каждая нативная ОС назначается/добавляет доступную память для JVM немного по-разному и с разным объемом, для получения подробной информации проверьте свой код с помощью некоторых JProfiler (живые объекты, переменные, используемая/доступная память, переработка памяти с помощью GC'ing)

2/ создайте только один JFrame, а другие контейнеры верхнего уровня будут JDialog/JWindow, не создавайте тонны JDialogs/JWindows, каждое повторное использование путем удаления всех JComponents больше информации здесь

3/ проблема с исправлением GPU и драйверами

person mKorbel    schedule 13.07.2011

Начиная с Java6 есть полноэкранный API. Рассмотрите возможность его использования: http://download.oracle.com/javase/tutorial/extra/fullscreen/index.html

person Michał Šrajer    schedule 29.07.2011
comment
Можете ли вы уточнить, как это может помочь? - person trashgod; 29.07.2011