0

我想为禁用的 JButton 设置一个图标。问题是,这样的代码:

package problemshowcase;

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

public class ProblemShowcase {
    JFrame frame1 = null;
    JButton btn = null;

    public static void main(String[] args) {
        ProblemShowcase test = new ProblemShowcase();
        test.makeFrame();
    }

    public void makeFrame()
    {
        frame1 = new JFrame();
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame1.setSize(500,500);

        btn = new JButton();
        btn.setDisabledIcon(new ImageIcon(getClass().getResource("/test.png")));
        btn.addActionListener(new someListener());

        frame1.getContentPane().add(btn);
        frame1.setVisible(true);
    }

    class someListener implements ActionListener{
        public void actionPerformed(ActionEvent ev){
            JButton foo = (JButton) ev.getSource();

            foo.setEnabled(false);
        }
    }
}

单击后使按钮完全变灰,上面没有任何图像。但是,当我将 setDisabledIcon() 更改为 setIcon() 时,它会在单击之前和之后显示正确的图像(尽管它显然是灰色的)。这里有什么问题?

4

3 回答 3

2

好的,所以只要没有设置“常规”图标,JButton(和 JToggleButton)似乎根本不会向您显示 DisabledIcon。因此,如果您想在单击之前保持按钮的非图标性(如果您像我一样编写扫雷器,那么您想要的)唯一的解决方案就是这样做:

package problemshowcase;

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

public class ProblemShowcase {
    JFrame frame1 = null;
    JButton btn = null;

    public static void main(String[] args) {
        ProblemShowcase test = new ProblemShowcase();
        test.makeFrame();
    }

    public void makeFrame()
    {
        frame1 = new JFrame();
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame1.setSize(500,500);

        btn = new JButton();
        btn.setDisabledIcon(new ImageIcon(getClass().getResource("/test.png")));
        btn.addActionListener(new someListener());

        frame1.getContentPane().add(btn);
        frame1.setVisible(true);
    }

    class someListener implements ActionListener{
        public void actionPerformed(ActionEvent ev){
            JButton foo = (JButton) ev.getSource();
            btn.setIcon(new ImageIcon(getClass().getResource("/test.png")));

            foo.setEnabled(false);
        }
    }
}

这样,您就在将按钮设置为禁用之前设置了“常规”图标,因此根本不会显示它。您还可以在那里放置一些 1x1 像素透明的东西。

不是最优雅的解决方案,但它似乎是唯一有效的解决方案......

于 2013-01-11T20:09:10.477 回答
1

setIcon 有效,而 setDisabledIcon 无效

两者在这里都工作得很好。单击黄色按钮可以看到它变成红色。

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

public class ProblemShowcase {
    JFrame frame1 = null;
    JButton btn = null;

    public static void main(String[] args) {
        ProblemShowcase test = new ProblemShowcase();
        test.makeFrame();
    }

    public void makeFrame()
    {
        frame1 = new JFrame();
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        btn = new JButton();
        btn.setIcon(new ImageIcon(getImage(Color.YELLOW,200,40)));
        btn.setDisabledIcon(new ImageIcon(getImage(Color.RED,200,40)));
        btn.addActionListener(new someListener());

        frame1.getContentPane().add(btn);

        frame1.pack();
        frame1.setVisible(true);
    }

    private BufferedImage getImage(Color color, int w, int h) {
        BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Graphics g = bi.getGraphics();
        g.setColor(color);
        g.fillRect(0,0,w,h);
        g.dispose();

        return bi;
    }

    class someListener implements ActionListener{
        public void actionPerformed(ActionEvent ev){
            JButton foo = (JButton) ev.getSource();

            foo.setEnabled(false);
        }
    }
}
于 2013-01-11T18:11:45.200 回答
0

似乎 JButton 和 JToggleButton 要求您在使用禁用图标之前调用 setIcon() 和 setDisabledIcon() 。我可以想到两种解决方法:

  1. 使用与按钮本身颜色相同的 1x1 像素图标调用 setIcon()。

  2. 继承 JButton 或 JToggleButton 并提供您自己的功能。

于 2013-01-11T20:19:35.440 回答