3

我正在尝试更改我的 JButton 的外观,以便按钮没有启动状态。

目前我有这样的事情: 我目前拥有的

我想要这样的东西:(NetBeans 示例来自 NetBeans)

换句话说,我只希望按钮没有任何焦点时按钮的图像可见。但是当用户单击或滚动它时,它的行为应该与常规按钮完全相同。

更多示例:

没有焦点

不想没有焦点不想专注

滚下

滚下滚下

点击

点击点击

我为我的按钮使用了一个内部类。它看起来像这样:

private class CustumJButton extends JButton
{

    public CustumJButton(Icon icon)
    {
        super(icon);
        int size = 30;
        setPreferredSize(new Dimension(size, size));
        setFocusable(false);
    }
}

谢谢阿约。

4

4 回答 4

3

我想你需要使用这两个东西来使它工作,setBorderPainted(boolean)setContentAreaFilled(boolean)

buttonObject.setBorderPainted(false);
buttonObject.setContentAreaFilled(false);

正如此示例中引用的那样,@mKorbel更改了 JButton的外观

import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ButtonDemo
{
    private JButton demoButton;
    private ImageIcon buttonImage;

    private void displayGUI()
    {
        JFrame frame = new JFrame("Button Demo Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel();
        try
        {
            //buttonImage = new ImageIcon(ImageIO.read(
            //  getClass().getResource("/image/bulb.gif")));
            buttonImage = new ImageIcon(ImageIO.read(
                new URL("http://gagandeepbali.uk.to/"
                                + "gaganisonline/swing/downloads/"
                                + "images/bulb.gif")));             
        }
        catch(Exception e)
        {
                e.printStackTrace();
        }
        demoButton = new JButton(buttonImage);
        setExceptionalState(demoButton);
        demoButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseEntered(MouseEvent me)
            {
                setNormalState(demoButton);
            }

            @Override
            public void mouseExited(MouseEvent me)
            {
                setExceptionalState(demoButton);
            }
        });

        contentPane.add(demoButton);
        frame.setContentPane(contentPane);
        frame.setSize(300, 100);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private void setExceptionalState(JButton button)
    {
        button.setBorderPainted(false);
        button.setContentAreaFilled(false);
    }

    private void setNormalState(JButton button)
    {
        button.setBorderPainted(true);
        button.setContentAreaFilled(true);
    }

    public static void main(String[] args)
    {
        Runnable runnable = new Runnable()
        {
            @Override
            public void run()
            {
                new ButtonDemo().displayGUI();
            }
        };

        EventQueue.invokeLater(runnable);
    }
}
于 2013-06-18T16:34:42.643 回答
3

setBorderPainted()您可以使用和setContentAreaFilled()方法来实现这一点。这是您要查找的内容的简短演示。我希望它能给你粗略的了解如何完成你的任务。:

在此处输入图像描述

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

class CustomJButton extends JButton 
{

    public CustomJButton(String icon)
    {
        super(icon);
        /*int size = 30;
        setPreferredSize(new Dimension(size, size));*/
        addFocusListener(new ButtonFocusAdapter());
        addMouseListener(new ButtonMouseAdapter());
        setContentAreaFilled(false);
        setBorderPainted(false);
        //setFocusable(false);//Don't use this method. This would avoid the focus event on JButton
    }
    private void decorateButton()
    {
        setContentAreaFilled(true);
        setBorderPainted(true);
    }
    private void unDecorateButton()
    {
        setContentAreaFilled(false);
        setBorderPainted(false);
    }
    private class ButtonFocusAdapter extends FocusAdapter
    {
        @Override
        public void focusGained(FocusEvent evt)
        {
            decorateButton();
        }
        @Override
        public void focusLost(FocusEvent evt)
        {
            unDecorateButton();
        }
    }
    private class ButtonMouseAdapter extends MouseAdapter
    {
        @Override
        public void mouseEntered(MouseEvent evt)
        {
            decorateButton();
        }
        @Override 
        public void mouseExited(MouseEvent evt)
        {
            unDecorateButton();
        }
    }
}
public class ButtonFrame extends JFrame
{
    public void createAndShowGUI()
    {
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        for (int i = 0; i < 4 ; i++ )
        {
            CustomJButton cb = new CustomJButton("Button "+i);
            c.add(cb);
        }
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    public static void main(String st[])
    {
        SwingUtilities.invokeLater( new Runnable()
        {
            @Override
            public void run()
            {
                ButtonFrame bf = new ButtonFrame();
                bf.createAndShowGUI();
                bf.setLocationRelativeTo(null);
            }
        });
    }
}
于 2013-06-18T16:41:23.523 回答
2

您可以将按钮的默认状态设置为:

button.setBorderPainted(false);

然后你需要使用 MouseListener:

在 mouseEntered 你会使用

button.setBorderPainted(true);

并在鼠标退出时使用

button.setBorderPainted(false);
于 2013-06-18T16:36:47.043 回答
1

您应该查看可换肤的“ Synth Look and Feel ”,但也请注意,从长远来看,Swing 将被JavaFX 弃用并取而代之。如果您正在构建一个新的应用程序,您可能需要考虑使用 JavaFX,它可以使用 CSS 进行蒙皮,以实现您正在寻找的效果。

于 2013-06-18T16:16:21.337 回答