【问题标题】:Click j/ToggleButton then set Icon/Image单击 j/ToggleButton 然后设置图标/图像
【发布时间】:2014-11-26 03:52:58
【问题描述】:

我正在制作一个类似于扫雷的 4x4 棋盘。每个按钮都有一个炸弹或其他图像。

这是我的代码:

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      
    this.jToggleButton1.setIcon(new javax.swing.ImageIcon("bombaa.png"));          
}         

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    this.jToggleButton1.setIcon(new javax.swing.ImageIcon("bombaa.png"));
}                    

也试过这种方式...

private void setIcon1(){
    setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("bombaa.png")));
}

并在 jButton1ActionPerformed 和 jButton1MouseClicked 中调用 setIcon() 但这会将我的图像设置为程序的主图标。

基本上我需要的是:单击一个按钮并只设置一次图像/图标。

【问题讨论】:

  • 首先,不要将MouseListeners 与JButtons 一起使用。您可以创建一个不允许将其关闭的自定义按钮模型,因此,一旦选择,它的状态将保持选中状态(直到您重置它),这样您就可以使用选中/未选中的图标属性。
  • 我尝试了 Statechanged 和 ActionPerformed 但图像显示当我将鼠标悬停在按钮上时(因为这些事件包括所有可能的操作,对吗?比如鼠标悬停、鼠标释放等)。无论如何,我会考虑创建自定义按钮,如果您有任何链接将不胜感激:)

标签: java swing click icons jtogglebutton


【解决方案1】:

首先创建您自己的按钮,您可以控制所选状态...

public class StickyModel extends JToggleButton.ToggleButtonModel {

    public void reset() {
        super.setSelected(false);
    }

    @Override
    public void setSelected(boolean b) {
        if (!isSelected()) {
            super.setSelected(b);
        }
    }

}

这将防止按钮在被设置为选中后变为“未选中”(它还包括一个 reset 方法,这将使您“未选中”它)

使用“空白”或空“默认”图标创建您的按钮,并将selectedIcon 属性设置为您希望在选择按钮时显示的内容...

JToggleButton btn = new JToggleButton();
btn.setModel(new StickyModel());
btn.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("/Blank.png"))));
btn.setSelectedIcon(new ImageIcon(ImageIO.read(getClass().getResource("/Bomb.png"))));

所以,当按钮被点击时,它将使用selectedIcon

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            try {
                add(createButton());
                add(createButton());
                add(createButton());
            } catch (IOException exp) {
                exp.printStackTrace();
            }
        }

        protected JToggleButton createButton() throws IOException {

            JToggleButton btn = new JToggleButton();
            btn.setModel(new StickyModel());
            btn.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("/Blank.png"))));
            btn.setSelectedIcon(new ImageIcon(ImageIO.read(getClass().getResource("/Bomb.png"))));
            return btn;

        }

    }

    public class StickyModel extends JToggleButton.ToggleButtonModel {

        public void reset() {
            super.setSelected(false);
        }

        @Override
        public void setSelected(boolean b) {
            if (!isSelected()) {
                super.setSelected(b);
            }
        }

    }

}

【讨论】:

  • 非常感谢!现在我需要用炸弹让对手上场,每转一圈,然后验证这个人什么时候赢。这是我两周后的最后一个项目,所以我可能会带着更多问题回来:p 再次感谢。
猜你喜欢
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
相关资源
最近更新 更多