java.awt.Frame.setBackground () не работает в OS X - PullRequest
2 голосов
/ 04 июня 2009

Я пытаюсь сгладить некоторые ошибки рендеринга пользовательского интерфейса в моем java-апплете в OS X, и я обнаружил ошибку, которую не могу выяснить.

Все открываемые нами окна, которые расширяют java.awt.Frame, похоже, игнорируют вызовы setBackground () и вместо этого используют OS X по умолчанию (матовый металлический или серый градиент, в зависимости от версии ОС). Все, что мы открываем для расширения Dialog, работает нормально.

Я попытался переопределить метод paint () и нарисовать там цвет фона. Однако это только частично работает. Фон в некоторых местах становится правильным цветом, но все дочерние компоненты фрейма по-прежнему рисуются с фоном OS X, а не с тем, который я установил, и теперь он выглядит еще хуже. Те же типы компонентов (Panel, Checkbox и т. Д.) Используются в паре расширяющих диалог окон, и они прекрасно работают там, так что я предполагаю, что в Frame должно быть что-то, что может испортить ситуацию.

Есть ли способ установить цвет фона для фрейма, который работает в OS X? Кто-нибудь еще видел это раньше?

Обратите внимание, что я застрял в коде со спецификацией Java 1.1, так как мне требуется поддержка JVM Microsoft (не начинайте ...).

1 Ответ

0 голосов
/ 04 июня 2009

Я нашел обходной путь. Я создал класс-оболочку для Frame, который создает дочернюю Panel и помещает все ее содержимое в эту панель. В Panel задан явно фоновый цвет (вместо того, чтобы позволить ему наследовать от своего родительского фрейма). Затем я изменил классы, которые расширили Frame, чтобы расширить мой новый класс-оболочку FrameW, и проблема исчезла.

Моя обертка на самом деле не функционально завершена, но она обрабатывает то, что мне нужно, чтобы справиться с использованием, которое у меня есть. Вот код, который я использовал, на случай, если кто-нибудь еще столкнется с этой проблемой:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Frame;
import java.awt.LayoutManager;
import java.awt.Panel;

/**
 * Wrapper for java.awt.Frame that wraps the contents in a Panel.  This is done
 * because Frames in OS X appear to ignore the background color, but if the
 * contents are wrapped in a Panel and that Panel is given the background color
 * then it works fine.
 */
public class FrameW extends Frame {

  private Panel wrapper;

  /** Constructs the Frame wrapper */
  public FrameW() {
    super();
    init();
  }

  /**
   * Constructs the Frame wrapper.
   * @param title The title to give the frame.
   */
  public FrameW(String title) {
    super(title);
    init();
  }

  public Component add(Component comp) {
    return wrapper.add(comp);
  }

  public Component add(String name, Component comp) {
    return wrapper.add(name, comp);
  }

  public Component add(Component comp, int index) {
    return wrapper.add(comp, index);
  }

  public void add(Component comp, Object constraints) {
    wrapper.add(comp, constraints);
  }

  public void add(Component comp, Object constraints, int index) {
    wrapper.add(comp, constraints, index);
  }

  public LayoutManager getLayout() {
    return wrapper.getLayout();
  }

  public void setLayout(LayoutManager mgr) {
    /* setLayout is called by Frame's constructor before our init runs. */
    if(this.wrapper == null) { return; }
    wrapper.setLayout(mgr);
  }

  public void setBackground(Color c) {
    super.setBackground(c);
    wrapper.setBackground(c);
  }

  /**
   * Overriding the insets of the frame will cause the panel used for the
   * background color to not take up the entire frame's area.  Instead, override
   * FrameW.getContentInsets() for setting the insets of the content.
   * @return The frame's insets
   */
  public Insets getInsets() {
    return super.getInsets();
  }

  /**
   * Override this instead of getInsets() in order to set the insets of the
   * FrameW.
   * @return The insets for the content
   */
  public Insets getContentInsets() {
    return new Insets(0, 0, 0, 0);
  }

  private void init() {
    this.wrapper = new Panel() {
      public Insets getInsets() {
        return FrameW.this.getContentInsets();
      }
    };

    super.setLayout(new BorderLayout());
    super.add(this.wrapper, BorderLayout.CENTER);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...