[英]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()才能使用禁用的图标。 我可以考虑以下两种方法:
调用带有1x1像素图标的setIcon(),该图标的颜色与按钮本身的颜色相同。
子类JButton或JToggleButton并提供您自己的功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.