【问题标题】:Using standard buttons from a Look and Feel使用外观和感觉中的标准按钮
【发布时间】:2023-04-03 03:07:01
【问题描述】:

我正在使用 Swing 制作 UI,我希望用于自定义对话框的按钮与标准对话框中的按钮具有相同的样式。

例如,在附图中,我有一个自定义对话框和标准文件选择对话框。我希望文件选择对话框中的“确定”和“取消”按钮用于我的自定义对话框中的等效按钮。

我希望我的应用程序使用它所运行的任何操作系统的默认系统外观,因此我不想尝试手动重新创建这些标准按钮。使用自动提供这些按钮的更严格的 Swing 类也不行,因为我还想在我的 UI 中其他更奇特的地方使用它们。

这个问题有简单的解决方法吗?

【问题讨论】:

    标签: java swing


    【解决方案1】:

    很抱歉成为坏消息的承担者,但似乎没有标准的方法来实现这个跨平台。默认按钮上的行为、助记符和图标由每种外观以非常具体的方式处理。

    这是一个 SO question,它回答了有关如何设置 the default OK and Cancel buttons on a dialog 的问题(默认按钮使用 getRootPane().setDefaultButton(...) 设置,而取消按钮需要自定义键盘侦听器。如果您非常 幸运的是,设置默认按钮可能会为其添加一个图标,具体取决于 UI 的编码方式。

    This forum thread addresses the issue of getting icon resources 来自UIManager。每个 LaF 都有一组 UI 默认值,例如颜色、文本、边框和图标。在所有 LaF 中都可以找到许多默认图标,但对于非标准图标,例如按钮上的图标,则无法保证。但是,如果您在提供的屏幕截图中告诉我您使用的是哪个 LaF,我可以查找其自定义 UI 类使用的资源键(或者如果您有源代码,您可以自己查找)。然后,您可以编写一个帮助方法,通过这些键查找图标,如果找到,则将它们添加到按钮中。

    【讨论】:

    • 感谢您的信息。在屏幕截图中,我使用的是用于 Ubuntu 的系统 LaF,但这个问题的希望是我能够让程序使用它运行的任何平台的系统 LaF,并且在每个平台上都显得相当原生。由于没有简单的方法可以做到这一点,我会尝试手动调整一些东西,使其在各种平台上看起来都不错,或者可能只是选择一个 LaF 并在所有平台上使用它......
    • 您真正能做的最好的事情是使用 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) ,它将在当前操作系统上使用最合适的 LaF。即便如此,“原生”的确切水平取决于实现,因此它永远不会是完美的。祝你好运!
    【解决方案2】:

    JButton.setUI(ButtonUI) 只为一个 JButton 设置 UI。将其与工厂结合使用:

    public static JButton createStyledButton(String text) {
       JButton button = new JButton(text);
       button.setUI(STYLE_UI);
       return button;
    }    
    

    【讨论】:

    • 这没有回答他的问题。标准 jfilechooser 小部件中的 Cancel 和 OK 按钮与他的自定义对话框的区别在于应用了图标和 mmnemonics。
    • 我已经这样做了 - 在显示的图像中,正在使用系统外观。我感兴趣的是获得一些用于该系统外观的标准按钮设计,以便在我的应用程序的其他地方使用,而不是尝试通过使用带有文本 + 图像的 JButtons 来重新构建它们。
    • @Oliver 我已经用自定义样式的按钮 ui 编辑了答案,希望它有助于解决您的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    相关资源
    最近更新 更多