【问题标题】:How to get a white background in Java Swing JButton in Windows 10如何在 Windows 10 中的 Java Swing JButton 中获得白色背景
【发布时间】:2019-05-17 19:50:16
【问题描述】:

我想在 Windows 10 中为 Java Swing 应用程序获取一个白色背景的 JButton。

我尝试了以下方法。我包含一个带有两个框架的功能基本示例,都有一个面板和一个按钮,第一个不包含任何自定义。按钮和面板具有浅蓝色/灰色(实际感知颜色取决于屏幕)。对于第二帧,我尝试显式绘制白色面板和按钮。

package com.example.test2;

import java.awt.Color;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test2 {

    public Test2() {

        // Frame 1, standard background
        JFrame frame1 = new JFrame();
        JPanel panel1 = new JPanel();
        JButton button1 = new JButton("Button 1");

        // Frame 2, white background
        JFrame frame2 = new JFrame();
        JPanel panel2 = new JPanel();
        JButton button2 = new JButton("Button 2");
        panel2.setBackground(Color.WHITE);
        button2.setBackground(Color.WHITE);

        // Add Components for Frame1 and show it
        frame1.add(panel1);
        panel1.add(button1);
        frame1.setSize(300, 200);
        frame1.setVisible(true);

        // Add Components for Frame2 and show it
        frame2.add(panel2);
        panel2.add(button2);
        frame2.setSize(300, 200);
        frame2.setLocation(250,150);
        frame2.setVisible(true);

    }

    public static void main(String[] args) {

        try {
            UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Test2.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(Test2.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(Test2.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(Test2.class.getName()).log(Level.SEVERE, null, ex);
        }
        Test2 t = new Test2();
    }
}

这是两帧的结果:

我怎样才能让button2有白色背景?

请注意,我已经尝试过此解决方案 (Changing the background color of JButton always shows as grey),但它在使用 Windows 10 并设置 L&F UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() ); 时不起作用。

【问题讨论】:

  • 嗨,我不认为这是重复的,我的问题是特定于 Java Swing 中的 Windows 10 使用 UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() ); 而所提到的问题的 OP 没有说明他的具体 L&F。该问题中建议的解决方法不会在此代码和 Windows 10(Oracle Java JDK 8)中产生任何结果。
  • 据我了解,您正在尝试获得与链接问题中的结果相似的结果?但是是白色的?
  • 根据我对链接问题的阅读和测试,有两个选项:a)循环函数和 b)删除他的代码中的 L&F 集。我已经尝试过循环功能,但它在我的情况下不起作用 -Windows 10 并设置 L&F-。并且移除 L&F 不是一种选择。我想要 Windows L&F,因此我调用 UIManager.getSystemLookAndFeelClassName。我的问题是针对 Windows 10 及其 SystemLookAndFeel 的。如果您可以使链接的示例在这种情况下工作-我不能-,那么欢迎一个工作且可运行的示例。
  • 你试过这个answer它可能与Windows无关,但谁知道。我无法在 Windows 上进行测试,因为我没有任何 Windows PC,所以我所能做的就是以这种方式提供支持。
  • 感谢您的建议。它也不起作用。正如你提到的,Windows L&F 似乎不支持改变它。最接近的解决方案是 Sambit 提供的解决方案,尽管解决方案没有解决保留大小和外边框颜色的问题。

标签: java swing jbutton


【解决方案1】:

setContentAreaFilled(false) 在这里施展魔法。

如在 Windows 10 上所见。

此代码使用青色的“中间”面板(更容易区分 PLAF 的默认浅灰色),以允许将按钮设置为与容器不同的颜色。如果您确实希望按钮与显示它的父容器颜色相同,则可以省略该中间面板。

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class Test2 {

    public Test2() {
        // Frame, orange background
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        JPanel panel = new JPanel();
        JButton button = new JButton("Button 2");
        button.setContentAreaFilled(false);
        panel.setBackground(Color.ORANGE);

        // Add Components
        frame.add(panel);
        panel.setBorder(new EmptyBorder(10,100,10,100));
        JPanel buttonColorPanel = new JPanel(new GridLayout());
        // adjust color as needed
        buttonColorPanel.setBackground(Color.CYAN);
        panel.add(buttonColorPanel);
        buttonColorPanel.add(button);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException |
                IllegalAccessException | UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        }
        Test2 t = new Test2();
    }
}

我做了一些其他代码更改,这些只是很好的做法,但与最终效果无关。 Swing GUI 也应该在 EDT 上启动。 BNI。

【讨论】:

  • 感谢您的贡献。该解决方案确实创建了一个平面彩色图标,该图标保留了原始大小,但它缺少:1)原始外边框,它界定了按钮并在鼠标悬停在按钮上时突出显示。 2)用户点击按钮时提供的视觉反馈。需要和问题是将按钮的颜色从灰色更改为白色,而无需进一步修改按钮的行为和属性。我开始认为这可能不太可能或太复杂,Java Swing 只适合灰色按钮适合的场景。
【解决方案2】:

你可以试试下面吗。

JButton button2 = new JButton("Button 2");
panel2.setBackground(Color.WHITE);
button2.setBackground(Color.WHITE);
button2.setContentAreaFilled(false);
button2.setOpaque(true);
button2.setBorder(new LineBorder(Color.BLACK,1));
button2.setFocusPainted(false);

【讨论】:

  • 这使按钮具有白色背景,但删除了边框装饰。
  • 尝试删除此行。 button2.setContentAreaFilled(false);
  • 尝试添加,button2.setBorder(new LineBorder(Color.BLACK,1));
  • 它创建一个白色背景,但不保留外框的按钮大小和颜色。保留大小可以通过getBorderInsets方法完成,但我不知道如何保留外部按钮框架的颜色。
  • 是的,它不会有默认尺寸,你必须增加尺寸。跑完我也看到了。喜欢的话点个赞吧。
猜你喜欢
  • 1970-01-01
  • 2011-08-15
  • 2011-01-06
  • 2011-03-12
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多