Нажмите j / ToggleButton, затем установите значок / изображение

1

Я делаю совет 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")));
}

и вызовите setIcon() в jButton1ActionPerformed и jButton1MouseClicked, но это устанавливает мое изображение в качестве основного значка для программы.

В основном, что мне нужно: нажмите кнопку и установите изображение/значок только один раз.

  • 1
    Во-первых, не используйте MouseListener s с JButton s. Вы можете создать пользовательскую модель кнопки, которая не позволяет отключить ее, поэтому после выбора ее состояние остается выбранным (до тех пор, пока вы не сбросите ее), чтобы вы могли использовать выбранные / невыбранные свойства значка.
  • 0
    Я пытался использовать Statechange и ActionPerformed, но изображение показывается, когда я наводю указатель мыши на кнопку (потому что эти события включают в себя все возможные действия, такие как наведение мыши, отпускание мыши и т. Д.). В любом случае, я посмотрю на создание пользовательской кнопки, если у вас есть ссылка, которая будет оценена :)
Теги:
swing
click
icons
jtogglebutton

1 ответ

4
Лучший ответ

Начните с создания собственной кнопки, для которой вы можете управлять выбранным состоянием...

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

Изображение 174551

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);
            }
        }

    }

}
  • 0
    Большое спасибо! Теперь мне нужно составить доску противника с бомбами и пройти 1 ход за каждую и проверить, когда человек выиграл. Это мой последний проект, который должен быть готов через две недели, поэтому я, вероятно, вернусь с большим количеством вопросов: спасибо еще раз.
  • 0
    Рад, что помогло и удачи;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню