繁体   English   中英

setIcon可以工作,而setDisabledIcon不能工作-为什么?

[英]setIcon works while setDisabledIcon doesn't - why?

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

好的,因此只要未设置“常规”图标,似乎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像素的透明物体。

这不是最优雅的解决方案,但似乎是唯一可行的解​​决方案...

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要求您同时使用setIcon()和setDisabledIcon()才能使用禁用的图标。 我可以考虑以下两种方法:

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

  2. 子类JButton或JToggleButton并提供您自己的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM