当Windows主题改变时,JInternalFrame会很奇怪吗?

时间:2011-08-18 09:23:05

标签: java swing windows-xp jframe look-and-feel

这是我的示例代码。我正在尝试将没有标题栏显示的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的{​​{1}}内显示JFrame,如下所示。

Before Theme Change

我仍然运行此UI,同时当我尝试更改我的XP主题(通过属性>>外观>>主题)时,UI会自动重新绘制自己以显示JInternalFrame标题栏再如下图所示。

After Theme Change

我无法理解这种奇怪的行为。如果这是Java Swing的一个问题,或者它是与操作系统相关的东西,我不知道。请在这件事上给予我帮助!

当我明确编写titleBar设置为null时,为什么在主题更改时UI重新绘制并启用标题栏?

PS:使用的操作系统是Windows XP,我不确定在Linux或其他版本的Windows中是否观察到相同的行为

1 个答案:

答案 0 :(得分:2)

'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 GUI并且在美国东部时间改变了。
  2. 为什么代码会将JInternalFrame直接添加到JDesktopPane以外的任何内容?
  3. 更改主题时,JInternalFrame的大小调整存在轻微问题。我怀疑它与代码中缺少validate() / pack()有关。由于这不是问题所在,我无法进一步调查它。

  4. 结果

    我在这里使用Windows 7获得了'null结果'。JInternalFrame的标题栏在更改时(按顺序)没有重新出现:

    1. 禁忌星球(一个自定义,简单的主题)
    2. Windows 7(Aero)
    3. 架构(航空)
    4. Windows 7 Basic(基本和高对比度)
    5. Windows Classic(基本和高对比度)
    6. 禁止的星球
相关问题