Как установить цвет кнопки JButton (не цвет фона) - PullRequest
5 голосов
/ 06 июня 2011

У меня есть JButton, для которого я хотел бы изменить цвет фона на белый. При использовании Metal Look And Feel я достигаю желаемого эффекта с setBackground:

Metal look-and-feel-styled JButton with a white background

К сожалению, понятие «цвет фона» отличается при использовании Windows LAF; цвет фона - это цвет, нарисованный вокруг кнопки:

Windows look-and-feel-styled JButton with a white background

Я хотел бы использовать Windows LAF, но разрешить изменение цвета кнопки JButton на белый. Как мне это сделать?

Ответы [ 5 ]

4 голосов
/ 07 июня 2011

Вам нужно решить, стоит ли это усилий, но вы всегда можете создать свой собственный ButtonUI, как показано в этом примере из-за @ mKorbel.

3 голосов
/ 06 июня 2011

Я использую JDK 6 на XP. Похоже, что пользовательский интерфейс Window не следует нормальным правилам рисования больше, чем 1. Как вы заметили, setBackground () не работает. Вы должны быть в состоянии сделать пользовательское рисование, сказав компоненту не заполнять область содержимого:

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

public class ButtonBackground extends JFrame
{
    public ButtonBackground()
    {
        setLayout( new FlowLayout() );

        JButton normal = new JButton("Normal");
        add(normal);

        JButton test1 = new JButton("Test 1")
        {
            @Override
            public void paintComponent(Graphics g)
            {
                g.setColor( Color.GREEN );
                g.fillRect(0, 0, getSize().width, getSize().height);
                super.paintComponent(g);
            }
        };
        test1.setContentAreaFilled(false);
        add(test1);
    }

    public static void main(String[] args)
    {
        try
        {
//          UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        }
        catch (Exception e2) {}

        ButtonBackground frame = new ButtonBackground();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}

Когда вы запускаете код как есть, он, кажется, работает правильно. То есть, когда вы нажимаете на кнопку, вы видите изменение границы. Однако, если вы работаете с Windows XP LAF, граница никогда не изменится, и вы не увидите эффекта нажатия кнопки.

Поэтому, я полагаю, проблема связана с WindowUI, и вам нужно будет настроить пользовательский интерфейс, который, вероятно, слишком сложен, поэтому у меня нет решения.

1 голос
/ 18 сентября 2013

Лучшим вариантом для вас является использование SwingX:

JXButton позволяет вам установить Painter для фона с помощью .setBackgroundPainter(Painter), используя MattePainter, чтобы достичь именно того, что вы хотите.Учитывая, что JXButton выходит за пределы JButton, изменения в вашем коде минимальны:

Color bg = new Color(new Random().nextInt(16777215)); // Random color

JButton button = new JButton();
button.setBackground(bg);

станет

JXButton button = new JXButton();
button.setBackgroundPainter(new MattePainter(bg));
1 голос
/ 07 июня 2011

, но я все еще думаю, что (изменено, но Даррилом) правильно UIManager.get ("Button.gradient") , потому что будет кроссплатформенным

РЕДАКТИРОВАТЬ: правильный ответ будет - Nimbus или некоторые Custom L & F , зачем изобретать велосипед (Роб)

0 голосов
/ 07 июня 2011

вместо того, чтобы связываться с цветом фона кнопки, не могли бы вы указать, что вы пытаетесь показать другим способом?

отображение значка, выделение кнопки жирным шрифтом вместо обычного текста и т. Д.

Указание чего-либо только через другой цвет фона не всегда очевидно, и, в зависимости от системных цветов пользователя, может быть резким или невидимым.

например, что если пользователь запускает окна в режиме "высокой контрастности"?

...