Java setIcon工作,而setDisabledIcon不工作';为什么?

Java setIcon工作,而setDisabledIcon不工作';为什么?,java,swing,jbutton,imageicon,Java,Swing,Jbutton,Imageicon,我想为禁用的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) { ProblemSho

我想为禁用的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()时,它在被单击之前和之后都会显示正确的图像(尽管之后它明显变灰)。这里怎么了

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);
        }
    }
}
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);
        }
    }
}
好吧,看来只要没有设置“常规”图标,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像素的透明的东西

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

好的,所以只要不设置“常规”图标,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像素的透明的东西


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

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

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

  • 子类JButton或JToggleButton并提供您自己的功能


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

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

  • 子类JButton或JToggleButton并提供您自己的功能


  • post和SSCCE,并使用UIManager.getIcon(“OptionPane.errorIcon/informationIcon/warningIcon/questionIcon”);相反,若要在此处编辑问题,可以在代码中使用换行符和缩进,以使问题更加清楚。为了更快地获得更好的帮助,请发布一个(带有换行符和适当的缩进)。post和SSCCE,并使用UIManager.getIcon(“OptionPane.errorIcon/informationIcon/warningIcon/questionIcon”);相反,若要在此处编辑问题,可以在代码中使用换行符和缩进,以使问题更加清楚。为了更快地获得更好的帮助,请发布一个(带有换行符和适当的缩进)。谢谢。但是,您也可以使用setIcon(),我不需要它(也不需要它,因为默认外观适合我)。当您从代码中删除“btn.setIcon(newimageicon(getImage(Color.YELLOW,200,40));”时,很遗憾,它不能像我的一样工作。那么,只要我希望setDisabledIcon()工作,即使普通的金属图标很好,我也必须设置一些图标吗?setIcon(null)不能使setDisabledIcon()工作,因此它看起来是这样的…您可以始终在
    setIcon()中放置一个透明图像,尽管它会在(不可见的)图像周围显示一个边框。是的,但正如您所说,边框将保持不变。这是否意味着没有解决方案,我只需要使用一些图标,不管我是否需要它?为什么你有一个完全简单的按钮(没有文本或图标)?因为每个按钮代表扫雷舰网格上的一个单元格。因此,没有必要在上面放任何东西。谢谢。但是,您也可以使用setIcon(),我不需要它(也不需要它,因为默认外观适合我)。当您从代码中删除“btn.setIcon(newimageicon(getImage(Color.YELLOW,200,40));”时,很遗憾,它不能像我的一样工作。那么,只要我希望setDisabledIcon()工作,即使普通的金属图标很好,我也必须设置一些图标吗?setIcon(null)不能使setDisabledIcon()工作,因此它看起来是这样的…您可以始终在
    setIcon()中放置一个透明图像,尽管它会在(不可见的)图像周围显示一个边框。是的,但正如您所说,边框将保持不变。这是否意味着没有解决方案,我只需要使用一些图标,不管我是否需要它?为什么你有一个完全简单的按钮(没有文本或图标)?因为每个按钮代表扫雷舰网格上的一个单元格。因此,没有必要在上面放置任何东西。