6 Stimmen

Wie man die Farbe einer JButton-Schaltfläche einstellt (nicht die Hintergrundfarbe)

Ich habe eine JButton die ich gerne in eine weiße Hintergrundfarbe ändern möchte. Wenn ich das Metall-Look-and-Feel verwende, erreiche ich den gewünschten Effekt mit setBackground :

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

Leider ist das Konzept der "Hintergrundfarbe" bei der Verwendung des Windows-LAF anders; die Hintergrundfarbe ist die Farbe, die um die Schaltfläche herum gezeichnet wird:

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

Ich möchte das Windows LAF verwenden, aber die Farbe der Schaltflächen dieses JButton auf weiß geändert werden. Wie kann ich das tun?

4voto

camickr Punkte 315810

Ich verwende JDK 6 unter XP. Es sieht so aus, als ob die Window UI in mehr als einer Hinsicht nicht den normalen Malregeln folgt. Wie Sie bemerkt haben, funktioniert setBackground() nicht. Sie sollten in der Lage sein, benutzerdefinierte Malerei zu tun, indem Sie der Komponente sagen, nicht in den Inhaltsbereich zu füllen:

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

Wenn Sie den Code so ausführen, wie er ist, scheint er richtig zu funktionieren. Das heißt, wenn Sie auf die Schaltfläche klicken, sehen Sie, dass sich der Rahmen ändert. Allerdings ist Sie mit dem Windows XP LAF laufen, die Border ändert sich nie, um Sie nicht sehen, die Schaltfläche klicken Wirkung.

Daher vermute ich, dass das Problem mit der WindowUI zusammenhängt und Sie die Benutzeroberfläche anpassen müssten, was wahrscheinlich zu komplex ist, so dass ich keine Lösung habe.

4voto

trashgod Punkte 199887

Sie müssen selbst entscheiden, ob sich der Aufwand lohnt, aber Sie können jederzeit eine eigene ButtonUI wie in dieser Abbildung gezeigt ejemplo aufgrund von @mKorbel.

2voto

mKorbel Punkte 109073

Aber ich denke immer noch, dass die (geänderte, aber von Darryl) korrekt ist UIManager.get("Button.gradient") weil es plattformübergreifend wäre

EDIT: Die richtige Antwort wäre - Nimbus oder etwas Benutzerdefinierte L&F , warum das Rad neu erfinden (von Rob)

1voto

Die beste Möglichkeit ist die Verwendung von SwingX:

JXButton erlaubt es Ihnen, einen Painter für den Hintergrund zu setzen mit .setBackgroundPainter(Painter) Mit einem MattePainter erreichen Sie genau das, was Sie wollen. Da JXButton von JButton abgeleitet ist, sind die Änderungen in Ihrem Code minimal:

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

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

werden würde

JXButton button = new JXButton();
button.setBackgroundPainter(new MattePainter(bg));

-1voto

John Gardner Punkte 22999

Könnten Sie, anstatt die Hintergrundfarbe der Schaltfläche zu ändern, den Hinweis, den Sie anzeigen möchten, auf eine andere Weise darstellen?

Anzeige eines Symbols, fett gedruckte Schaltflächen anstelle von normalem Text, usw.

Etwas nur durch eine andere Hintergrundfarbe anzuzeigen, ist nicht immer offensichtlich und kann, je nach den Systemfarben des Benutzers, störend oder unsichtbar sein.

Was ist beispielsweise, wenn der Benutzer Windows im Modus "Hoher Kontrast" ausführt?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X