【问题标题】:JInternalFrame acts weird when windows theme changed?当 Windows 主题更改时,JInternalFrame 行为怪异?
【发布时间】:2011-08-18 09:23:04
【问题描述】:

这是我的示例代码。我正在尝试将没有标题栏显示的 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();
 }
}

代码工作正常,并在JFrame 内显示JInternalFrame,没有标题栏,如下所示。

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

我就是无法理解这种奇怪的行为。我不知道这是 Java Swing 的问题还是与操作系统有关的问题。请在这件事上给予我帮助!

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

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

【问题讨论】:

  • Tips: 1) "java swings" 不,那是“Java Swing”(注意大写字母和's'字符的数量)。 2) "..不确定在...其他版本的 Windows 中是否观察到相同的行为"如果您发布了 @987654321,我可以告诉您在 Windows 7 中是否相同@.
  • @Andrew 我在 groovy 控制台上将之前的代码 sn-p 作为脚本运行。因此,如果您要求的是 java,我已经进行了相同的编辑。

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


【解决方案1】:

'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. 应在 EDT 上构建和更改 Swing GUI。
  2. 为什么代码将JInternalFrame 直接添加到JDesktopPane 以外的任何内容?
  3. 在更改主题时,JInternalFrame 的大小存在一些小问题。我怀疑这与代码中缺少validate()/pack() 有关。既然这不是问题所在,我就懒得进一步调查了。

结果

我在使用 Windows 7 时得到了一个“空结果”。JInternalFrame 的标题栏在任何时候都没有重新出现(按顺序):

  1. Forbidden Planet(自定义的简单主题)
  2. Windows 7(航空)
  3. 建筑(航空)
  4. Windows 7 Basic(基本和高对比度)
  5. Windows 经典版(基本和高对比度)
  6. 禁星

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    相关资源
    最近更新 更多