Как получить белый фон в Java Swing JButton в Windows 10 - PullRequest
1 голос
/ 17 мая 2019

Я хочу получить JButton с белым фоном в Windows 10 для приложения Java Swing.

Я пробовал следующее. Я включил функциональный базовый пример с двумя фреймами, у обоих есть панель и кнопка, первый не включает никаких настроек. Кнопки и панели имеют светло-синий / серый цвет (фактический воспринимаемый цвет зависит от экрана). Для второго кадра я пытаюсь явно нарисовать белые панели и кнопки.

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();
    }
}

Это результат для обоих кадров:

Frames 1 and 2 - White background

Как сделать, чтобы у button2 был белый фон?

Примечание. Я пробовал это решение ( Изменение цвета фона JButton всегда отображается серым ), и оно не работает при использовании Windows 10 и настройке L & F UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );.

Ответы [ 2 ]

2 голосов
/ 18 мая 2019

setContentAreaFilled(false) совершает магию здесь.

Как видно на Windows 10.

enter image description here

В этом коде используется голубая панель «между» (проще различить светло-серый цвет 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 также должны быть запущены на EDT. BNI.

1 голос
/ 17 мая 2019

Можете ли вы попробовать ниже.

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);
...