2014-11-26 2 views
1

Я делаю плату 4x4 вроде как тральщик. У каждой кнопки есть бомба или другое изображение.Нажмите j/ToggleButton, затем установите значок/изображение

Вот мой код:

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. Вы можете создать пользовательскую модель кнопки, которая не позволяет ее отключать, поэтому, после ее выбора, это состояние остается выбрано (до его сброса), таким образом вы можете использовать выбранные/невыбранные свойства значка. – MadProgrammer

+0

Я попробовал Statechanged и ActionPerformed, но изображение отображается, когда я наводил курсор мыши на кнопку (потому что эти события включают в себя все возможные действия, такие как мыши, курсор мыши и т. Д.). В любом случае, я займусь созданием пользовательской кнопки, если у вас есть какая-то ссылка, которая была бы оценена :) –

ответ

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

Sticky Buttons

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 оборот каждый и проверить, когда человек побеждает. Это мой последний проект за две недели, поэтому я, скорее всего, вернусь с дополнительными вопросами: p спасибо еще раз. –

+0

Рад, что это помогло и удачи;) – MadProgrammer