Ошибка рисования Java 1.5 JOptionPane при использовании панели сообщений / обходного пути?
У меня есть JOptionPane с настраиваемой панелью сообщений в приложении, предназначенном для Java 1.5. Панель содержит, помимо прочего, JTextField. Каждые 20 вызовов или около того ничего в диалоге не отображается (даже кнопки OK/ Отмена). Если я перетащу диалоговое окно за пределы экрана и вернусь обратно, чтобы вызвать перерисовку, компоненты будут видны, как и ожидалось, и, кроме проблемы рисования, компоненты будут работать нормально. Вот самый маленький пример, который я мог бы показать, чтобы показать эту ошибку:
public class BugTest {
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// The text field needs to be wrapped in a panel for the bug to show up.
JPanel messagePanel = new JPanel();
// A JLabel won't exhibit the bug, but a JTextField will.
JTextField textField = new JTextField("Some content");
messagePanel.add(textField);
// Loop so we can keep clicking OK until the bug shows up.
while (true) {
int res = JOptionPane.showOptionDialog(null, messagePanel,
"SomeTitle", JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE, null, null, null);
}
}
});
}
}
Это известная ошибка в Swing? Есть ли стандартный обходной путь? Мне не удалось найти официальный отчет об ошибке для этого. Ошибка, по-видимому, отсутствует в Java 1.7, но мое приложение должно работать на более старой версии 1.5, и я хотел бы найти обходной путь, который работает на последней.
Связанный: немодальный JDialog не отображает содержимое (не содержит пример кода, поэтому трудно понять, если это та же ошибка)
Конкретная версия Java, на которой я обнаружил ошибку - 1.5.0_22.
1 ответ
Эта ошибка может быть воспроизведена в Java 1.5 до Java 7, работающей в Windows Vista и XP (возможно, также в Win7)
Посмотрите на этот отчет об ошибке (идентификатор ошибки: 6859086)
Наиболее вероятная причина проблемы - утечка ресурсов GDI. Посмотрите, можете ли вы отслеживать ресурсы GDI, используемые процессом Java, с помощью диспетчера задач или проводника процессов.
РЕДАКТИРОВАТЬ: Согласно отчету об ошибке, обходной путь недоступен, но вы можете попробовать поиграть с несколькими вариантами выполнения:
-Dswing.handleTopLevelPaint=false
-Dsun.java2d.d3d=true