2009-06-04 4 views
2

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

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

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

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

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

+0

Свинг пробежал 1.1, не так ли? –

+0

Свинг не существовал, по крайней мере, до 1.2. Я не могу его использовать, и сейчас переписывание пользовательского интерфейса, как и в любом случае, не может быть и речи. – Herms

+0

Свинг не был частью 1.1, но был доступен для него. По большей части преобразование с AWT в Swing - это операция поиска и замены. –

ответ

0

Я нашел обходное решение. Я создал класс оболочки для Frame, который создает дочернюю панель и помещает все ее содержимое в эту панель. Панель имеет цвет фона, установленный явно (вместо того, чтобы позволить ему наследовать его родительский кадр). Затем я изменил классы, которые расширили 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); 
    } 
} 
+0

Поскольку это, кажется, работает, и никто другой не предложил что-либо, я думаю, я отмечу это как ответ – Herms

 Смежные вопросы

  • Нет связанных вопросов^_^