Ошибка рисования 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
Другие вопросы по тегам