Изменение основного цвета фона окна Swing - PullRequest
13 голосов
/ 06 мая 2010

Как обсуждено здесь , при изменении размера приложения Swing в Vista (и Windows 7, что я и использую) вы получаете черный фон в правом / нижнем углу, в то время как перерисовка Swing перехватывает до изменения.

Игра с другими приложениями (Windows Explorer (Native), Firefox (C ++?) И Eclipse (Java)). Я заметил, что у всех них есть такая же проблема - вопреки тому, что говорят люди в приведенной выше ссылке - но они сводят к минимуму проблема в наличии серого цвета заливки, который гораздо менее визуально сотрясает, чем черный цвет, который появляется в Swing.

Мне интересно, есть ли способ изменить это так, чтобы Swing вел себя как эти другие приложения? Я попытался установить цвет фона JFrame, но безрезультатно.

Дополнительная информация Джонас обнаружил (см. Их информативный ответ ниже), что это проблема с JFrames, но не с AWT Frames - возможно, это поможет кому-то это выяснить.

Ответы [ 3 ]

3 голосов
/ 06 мая 2010

Я заметил ту же проблему. Этот цвет серый в IE, в Opera - черный, а в Eclipse - серый. Он кажется более заметным в Swing, потому что он выглядит немного медленнее при перекрашивании, а цвет, как вы сказали, черный . Эта проблема более заметна, если вы используете верхний левый угол для изменения размера.

Я закодировал пример и попытался понять, где определяется этот черный цвет. A JFrame имеет много слоев , поэтому я устанавливаю различный фон для каждого слоя.

import java.awt.Color;
import javax.swing.JFrame;

public class BFrame {

    public static void main(String[] args) {
        new JFrame() {{
            super.setBackground(Color.CYAN);
            this.getRootPane().setBackground(Color.BLUE);
            this.getLayeredPane().setBackground(Color.RED);
            this.getContentPane().setBackground(Color.YELLOW);
            this.setSize(400,340); 
            this.setVisible(true);
        }};
    }
}

Но этот пример не помог. И может быть, цвет установлен суперклассом на Frame .

java.lang.Object
  java.awt.Component
      java.awt.Container
          java.awt.Window
              java.awt.Frame

Моя теория такова, что поскольку Swing рисует сам, но использует собственное окно, то собственный фон окрашивается до изменения размера, а фон Swing окрашивается после изменения размера. Но для нативных приложений фон перед изменением размера окрашивается.

ОБНОВЛЕНИЕ: Я попытался с Frame сейчас, и у него нет той же проблемы. Фоновый шов, который будет окрашен перед изменением размера.

import java.awt.Color;
import java.awt.Frame;

public class B2Frame extends Frame {

    public static void main(String[] args) {
        new Frame() {{
            setBackground(Color.YELLOW);
            setSize(400,340);
            setVisible(true);
        }};
    }

}
2 голосов
/ 14 февраля 2011

Рамка отвечает за покраску фона, поэтому вам нужно убедиться, что она выполняет свою работу.

Вы демонстрируете это, установив:

System.setProperty("sun.awt.noerasebackground", "true");

Это приведет к тому, что фон всегда будет черным при расширении размера. (Так что не делай этого.)

У меня сработало следующее:

  1. (только для AWT) Настройте двойную буферизацию с помощью createBufferStrategy(2) - обернутый в addNotify(), иначе вы столкнетесь с исключениями при создании кадра

    (Шаг 1 необходим только в AWT, поскольку Swing по умолчанию имеет двойную буферизацию.)

  2. Всегда (важно) вызывать super() в вашей Frame.paint() реализации

  3. Задайте цвет фона с помощью setBackground(), тогда при расширении рамки фон всегда должен быть одного цвета

Пример кода:

    class InnerFrame extends Frame {
        public void addNotify() {
            super.addNotify();
            // Buffer
            createBufferStrategy(2);           
            strategy = getBufferStrategy();
        }

        public void paint(Graphics g) {
            super(g);
            //...
        }
        //...
     }
1 голос
/ 06 мая 2010

Я тоже это заметил. Для меня эта проблема была решена с помощью смены менеджера компоновки (ранее я использовал Free Form Layout), и она работала довольно хорошо (системная окраска цвета).

Но в конце концов я переключился на FFL. Также некоторые известные приложения сталкиваются с этой проблемой (например, SKYPE), но я на самом деле не против ...

...