我想为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()时,它会在单击之前和之后显示正确的图像(尽管它显然是灰色的)。这有什么不对?
答案 0 :(得分:2)
好的,所以看起来JButton(和JToggleButton)根本不会显示DisabledIcon,只要“常规”图标也没有设置好。因此,如果您想要在点击之前维护非iconnity (您想要的话,如果您像我一样编码扫雷,我猜想)按钮,那么唯一的解决方案已经让我想到了这样做:
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像素透明的东西。
不是最优雅的解决方案,但它似乎是唯一有效的解决方案......
答案 1 :(得分: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);
}
}
}
答案 2 :(得分:0)
似乎JButton和JToggleButton要求您在使用禁用图标之前调用setIcon()和setDisabledIcon()。我可以想出两种解决方法:
使用与按钮本身颜色相同的1x1像素图标调用setIcon()。
子类JButton或JToggleButton并提供您自己的功能。