为什么我的JButton看起来与不同的计算机不同?

时间:2010-04-27 12:57:16

标签: java cross-platform colors icons jbutton

我在我的应用程序中使用JButtons。他们需要有不同的颜色。首先,我使用了btn.setBackground(col);。它适用于我的计算机和另一台计算机,我的按钮只是灰色(不是红色,因为它应该是)。

试图解决这个问题我决定使用图像。我是通过以下方式完成的:tmp = new JButton(newIcon);

同样,它在我的计算机和另一台计算机上工作正常,我只看到灰色按钮。

有没有人有任何想法可能是问题的原因以及如何解决?我听说它可能与“原生系统的外观”有关。但我不知道这意味着什么,如果是这样的话该怎么办?任何人都可以请求帮助我吗?

3 个答案:

答案 0 :(得分:2)

Swing具有可插入look and feels的概念。其中一些外观和感觉模仿了Windows,GTK +等本机组件的外观。即使在Windows上,也有两种独立的外观 - 我认为经典和Vista。也许你在两个系统上使用不同的操作系统和一个自动设置外观的GUI设计器。但大多数情况下 - 默认的外观和感觉Metal(在Java 1.6.10之前)和Nimbus在每个操作系统上看起来都是一样的。

   // build the look and feel section
    final LookAndFeelInfo[] lookAndFeelInfos = UIManager.getInstalledLookAndFeels();
    List<String> lookAndFeelNames = new ArrayList<String>();
    lookAndFeelNames.add("System");

    for (LookAndFeelInfo lookAndFeelInfo : lookAndFeelInfos) {
        if (!lookAndFeelInfo.getName().equals("CDE/Motif")) {
            lookAndFeelNames.add(lookAndFeelInfo.getName());
        }
    }

  if (selectedLookAndFeel.equals("System")) {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException ex) {
                        java.util.logging.Logger.getLogger(SpellbookFrame.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (InstantiationException ex) {
                        java.util.logging.Logger.getLogger(SpellbookFrame.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IllegalAccessException ex) {
                        java.util.logging.Logger.getLogger(SpellbookFrame.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (UnsupportedLookAndFeelException ex) {
                        java.util.logging.Logger.getLogger(SpellbookFrame.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } else {
                    for (LookAndFeelInfo lookAndFeelInfo : lookAndFeelInfos) {
                        if (lookAndFeelInfo.getName().equals(selectedLookAndFeel)) {
                            try {
                                UIManager.setLookAndFeel(lookAndFeelInfo.getClassName());
                            } catch (ClassNotFoundException e1) {
                                e1.printStackTrace();
                            } catch (InstantiationException e1) {
                                e1.printStackTrace();
                            } catch (IllegalAccessException e1) {
                                e1.printStackTrace();
                            } catch (UnsupportedLookAndFeelException e1) {
                                e1.printStackTrace();
                            }
                        }
                    }
                }

                SwingUtilities.updateComponentTreeUI(tabbedPane);
                SwingUtilities.updateComponentTreeUI(parent);

代码的第一部分构建了可用外观名称的列表,第二部分代码选择了其中一个。但是因为你总是希望使用相同的laf,你可以使用类似的东西:

UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");

答案 1 :(得分:2)

是的,这取决于操作系统。在Windows,WindowsClassic等不同的操作系统中,相同的按钮可能会有所不同, 您可以通过应用不同的“外观和感觉”来查看系统的差异。为此你应该知道UIManager Class。

例如,对于WindowsClassic,

UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");

对于Nimbus的外观和感觉,

UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");

有关详细信息,请参阅以下链接。

Look And Feel Tutorials

答案 2 :(得分:0)

外观(LaF)是您的Java应用程序将获得的外观,它取决于您的操作系统。

您可以为应用程序设置外观并避免此问题

尝试看看物质的外观和感觉。该网站包含该库并教授如何使用它 https://substance.dev.java.net/

您可以定义GUI的外观并使用您的程序导出库,每个人都将获得相同的外观。