4

私は次のようにネイティブLAFを使用するJavaアプリケーションを持っています:

    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

これはうまく機能していますが、ボタンの背景を赤にしようとしていますが、最終的には次のようになります。

ここに画像の説明を入力してください

ご覧のとおり、ボタンの背景と前景を設定していますが、結果は視覚的に満足のいくものではありません。 JButtonをサブクラス化せずに、ボタンに赤い背景を描画させる方法はありますか?

4

4 に答える 4

4

SwingのLook&Feel構造では、描画を行うのはJButton自体ではなくJButtonのUIデリゲートであるためsetBackground(...)、この状況ではうまく機能しないことを理解する必要があります。代わりに、ボタンにアイコンを追加したほうがよいでしょう。

于 2012-06-10T23:10:10.847 に答える
4

クリックマウスのグラデーションエンド効果を使用して独自のCustomColorButtonを作成しました。

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

次のような新しいボタンを作成できます。

CustomColorButton button = new CustomColorButton(Color.RED, Color.WHITE); // Background and font color
button.setText("Color button!");

CustomColorButtonクラス:

public class CustomColorButton extends JButton implements ActionListener, MouseListener
{
    private boolean hovered = false;
    private boolean clicked = false;

    private Color normalColor = null;
    private Color lightColor = null;
    private Color darkColor = null;

    public CustomColorButton(Color normalRedColor, Color fontColor)
    {
        setForeground(fontColor);

        this.normalColor = normalRedColor;
        this.lightColor = normalRedColor.brighter();
        this.darkColor = normalRedColor.darker();

        addActionListener(this);
        addMouseListener(this);
        setContentAreaFilled(false);
    }

    /**
     * Overpainting component, so it can have different colors
     */
    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        GradientPaint gp = null;

        if (clicked)
            gp = new GradientPaint(0, 0, darkColor, 0, getHeight(), darkColor.darker());
        else if (hovered)
            gp = new GradientPaint(0, 0, lightColor, 0, getHeight(), lightColor.darker());
        else
            gp = new GradientPaint(0, 0, normalColor, 0, getHeight(), normalColor.darker());

        g2d.setPaint(gp);

        // Draws the rounded opaque panel with borders
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // For High quality
        g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 7, 7);

        g2d.setColor(darkColor.darker().darker());
        g2d.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 7, 7);

        super.paintComponent(g);
    }

    @Override
    public void actionPerformed(ActionEvent arg0)
    {
        System.out.println("Button clicked!");
    }

    @Override
    public void mouseClicked(MouseEvent arg0)
    {

    }

    @Override
    public void mouseEntered(MouseEvent arg0)
    {
        hovered = true;
        clicked = false;

        repaint();
    }

    @Override
    public void mouseExited(MouseEvent arg0)
    {
        hovered = false;
        clicked = false;

        repaint();
    }

    @Override
    public void mousePressed(MouseEvent arg0)
    {
        hovered = true;
        clicked = true;

        repaint();
    }

    @Override
    public void mouseReleased(MouseEvent arg0)
    {
        hovered = true;
        clicked = false;

        repaint();
    }
}
于 2014-05-29T13:46:23.117 に答える
2

私がした問題に出くわした人のために、私が行った解決策は次のとおりです。

ImageIconを使用して、ボタンの子として追加された画像を使用するように切り替えました。

    BufferedImage stopPicture = null;
    try {
        stopPicture = ImageIO.read(new File("stop.png"));
    } catch (IOException ex) { }
    JLabel picLabel = new JLabel(new ImageIcon( stopPicture ));
    JButton btnStop = new JButton("");
    btnStop.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            SerialTest.getInstance().stopMoving();
        }
    });
    btnStop.add(picLabel);
于 2012-06-10T23:52:19.203 に答える
0

「サブクラス化なし」とは、自分で拡張する必要がないことを意味する場合、SwingX JXButtonを使用するオプションがあります。これにより、JButtonが拡張されてペインター(およびその他)が使用されます。

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

になります

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

ベースのJButtonに固執する必要がある場合、L&Fの動作方法が原因で、解決策はないと思います。

于 2013-09-18T08:34:05.340 に答える