Ошибка рисования Java 1.5 JOptionPane при использовании панели сообщений / обходного пути? - PullRequest
4 голосов
/ 06 декабря 2011

У меня есть JOptionPane с настраиваемой панелью сообщений в приложении, предназначенном для Java 1.5. Панель содержит, помимо прочего, JTextField. Каждые 20 вызовов или около того ничего в диалоговом окне не отображается (даже кнопки ОК / Отмена). Если я перетащу диалоговое окно за пределы экрана и вернусь обратно, чтобы вызвать перерисовку, компоненты будут видны, как и ожидалось, и, кроме проблемы рисования, компоненты будут работать нормально. Вот самый маленький пример, который я мог получить, чтобы показать эту ошибку:

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 Ответ

5 голосов
/ 06 декабря 2011

Эта ошибка может быть воспроизведена на Java 1.5 до Java 7, работающей в Windows Vista и XP (возможно, также на Win7)

Посмотрите на этот отчет об ошибке (идентификатор ошибки): 6859086)

Наиболее вероятная причина проблемы - утечка ресурсов GDI.Посмотрите, можете ли вы отслеживать ресурсы GDI, используемые процессом java, с помощью диспетчера задач или проводника процессов.

РЕДАКТИРОВАТЬ: Согласно сообщению об ошибке, обходной путь недоступен, но вы можете попробовать поиграть спара параметров времени выполнения:

  • -Dswing.handleTopLevelPaint=false
  • -Dsun.java2d.d3d=true
...