JInternalFrame ведет себя странно, когда тема Windows изменилась? - PullRequest
2 голосов
/ 18 августа 2011

Это мой пример кода.Я пытаюсь вставить JInternalFrame без отображения заголовка в JFrame.

import javax.swing.*;
import javax.swing.plaf.basic.BasicInternalFrameUI;

class A{

public void doThis(){
    JFrame fr = new JFrame();
    fr.setSize(300,300);
    JInternalFrame f = new JInternalFrame();
    f.setSize(200,200);
    BasicInternalFrameUI ui = (BasicInternalFrameUI) f.getUI();
    ui.setNorthPane(null);
    f.setVisible(true);
    fr.add(f);
    fr.setVisible(true);
    }
}

class MainA{

 public static void main(String a[]){
    A obj = new A();
    obj.doThis();
 }
}

Код работает нормально и отображает JInternalFrame в пределах JFrame без заголовка в соответствии с требованиями, как показанониже.

Before Theme Change

У меня все еще работает этот пользовательский интерфейс, и в то же время, когда я пытаюсь изменить свою тему XP (через Свойства >> Внешний вид >> Тема), пользовательский интерфейс автоматически перерисовывает себячтобы снова показать JInternalFrame с заголовком, как показано ниже.

After Theme Change

Я просто не могу понять это странное поведение.Я понятия не имею, если это проблема с Java Swing или это связано с ОС.Пожалуйста, помогите мне с этим!

Почему пользовательский интерфейс перекрашивается при смене темы с включенным заголовком, когда я явно кодирую для заголовка заголовка, который должен быть установлен как ноль?

PS: используется ОС Windows XP, и я не уверен, еслитакое же поведение наблюдается в Linux или других версиях Windows

1 Ответ

2 голосов
/ 18 августа 2011

'do' - это ключевое слово в Java, поэтому код не компилируется для меня. Этот код делает.

import javax.swing.*;
import javax.swing.plaf.basic.BasicInternalFrameUI;

class A{

    public void doIt(){
        JFrame fr = new JFrame();
        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fr.setSize(300,300);
        JInternalFrame f = new JInternalFrame();
        f.setSize(200,200);
        fr.add(f);
        BasicInternalFrameUI ui = (BasicInternalFrameUI) f.getUI();
        ui.setNorthPane(null);
        f.setVisible(true);
        fr.setVisible(true);
    }

 public static void main(String a[]){
    A obj = new A();
    obj.doIt();
 }
}

Некоторые заметки / вопросы:

  1. Интерфейсы Swing должны быть построены и изменены на EDT.
  2. Почему код добавляет JInternalFrame непосредственно к чему-либо, кроме JDesktopPane?
  3. Есть небольшие проблемы с размером JInternalFrame при смене темы. Я подозреваю, что это связано с отсутствием validate() / pack() в коде. Поскольку это был не вопрос, я не мог быть обеспокоен дальнейшим его изучением.

Результаты

Я получил «нулевой результат» здесь с помощью Windows 7. Строка заголовка JInternalFrame не появлялась повторно при изменении (по порядку):

  1. Запретная планета (пользовательская, простая тема)
  2. Windows 7 (Aero)
  3. Архитектура (Аэро)
  4. Windows 7 Basic (Basic & High Contrast)
  5. Windows Classic (базовая и высокая контрастность)
  6. Запретная планета
...