2016-05-06 11 views
0

Image Icons on JButtonsNach ImageIcons zu JButtons Hinzufügen Tasten nicht mehr arbeiten

ich früh ein Projekt abgeschlossen, so mit der verbleibenden Zeit, die ich vor dem Absenden hatte ich experimentieren wollte. Das gesamte Programm funktioniert großartig, und die JButtons taten genau so, wie sie programmiert waren.

Nach dem Hinzufügen von ImageIcon (s) zu meinen JButtons ist etwas schief gelaufen. Ich werde ein paar der JButton Initialisierungen zeigt und über jeden Block das Original in einem einzigen Kommentar:

/** 
* create child components 
*/ 
private void initComponents() { 

    //normalSetupButton = new JButton("Normal Setup"); 
    ImageIcon normalButtonImage = new ImageIcon("src/Images/normalIcon.png"); 
    normalSetupButton = new JButton(); 
    normalSetupButton.setIcon(normalButtonImage); 
    normalSetupButton.addActionListener(buttonHandler); 
    normalSetupButton.setToolTipText("Set up simulation for normal execution"); 

    // queen test button 
    //queenTestButton = new JButton("Queen Test"); 
    ImageIcon queenButtonImage = new ImageIcon("src/Images/yellowIcon.jpg"); 
    queenTestButton = new JButton(); 
    queenTestButton.setIcon(queenButtonImage); 
    queenTestButton.addActionListener(buttonHandler); 
    queenTestButton.setToolTipText("Set up to test Queen Lifespan or Food Levels"); 

    // scout test button 
    //scoutTestButton = new JButton("Scout Test"); 
    ImageIcon scoutButtonImage = new ImageIcon("src/Images/blueIcon.png"); 
    scoutTestButton = new JButton(); 
    scoutTestButton.setIcon(scoutButtonImage); 
    scoutTestButton.addActionListener(buttonHandler); 
    scoutTestButton.setToolTipText("Set up simulation for testing the Scout ant"); 
} 

Der nur Unterschied mit den Tasten ist, dass es jetzt ImageIcons ist und nicht als Text.

Mein Problem liegt in dem folgenden Code. Dies ist das erste Mal, dass ich ImageIcons auf Schaltflächen verwendet habe, daher war ich schon immer daran gewöhnt, "button.getText(). Equals (" Button String ");"

Also, Swing Gurus, wie feuert man ein Ereignis basierend auf dem ImageIcon eines JButton? Danke für jede Hilfe angeboten. Wenn das nicht funktioniert, ändere ich es gerne wieder in die alte Version mit einfachem Text.

HINWEIS Ja, ich weiß, dass die Bilder nicht alle im selben Format sind. Sie werden nicht die endgültigen Bilder sein. Ich teste gerade und schnappte mir jedes Format, das ich für jetzt finden konnte.

+0

[zum Beispiel] (http://stackoverflow.com/questions/34863894/how-to-use-actionperformed-actionevent-e-with-more-that -on-button/34864401 # 34864401) – MadProgrammer

Antwort

2

Du keinen Text zu JButton so eingestellt, dass es nicht funktioniert, wenn Sie Text Text gesetzt, dann wird es auf dem Bild erscheinen, also können Sie die setName Methode und fügen Sie Text, dass eine Sache 1. Stellen Sie tun. 2. in actionPerformed, verwenden Sie getName statt getText.

Beispiel:

ImageIcon normalButtonImage = new ImageIcon("src/Images/normalIcon.png"); 
    normalSetupButton = new JButton(); 
    normalSetupButton.setIcon(normalButtonImage); 
    normalSetupButton.setName("Normal Setup"); 
    normalSetupButton.addActionListener(buttonHandler); 
    normalSetupButton.setToolTipText("Set up simulation for normal execution"); 

In Aktion durchgeführt:

public void actionPerformed(ActionEvent e) { 
      // get the button that was pressed 
      JButton b = (JButton) e.getSource(); 

      // fire appropriate event 
      if (b.getName().equals("Normal Setup")) { 
       // set up for normal simulation 
       fireSimulationEvent(SimulationEvent.NORMAL_SETUP_EVENT); 
      } 
...... 
+0

Oder benutze 'setActionCommand', was es für – MadProgrammer

0

@ Sandeep.K

Ich werde noch Ihre Antwort akzeptieren, weil ich den kürzeren Anruf zu mögen "Normales Setup" Ich ging den langen Weg herum, bevor ich deine Antwort sah. Beide arbeiten, aber deine ist besser.

public void actionPerformed(ActionEvent e) { 
       // get the button that was pressed 
       JButton b = (JButton) e.getSource(); 

       // fire appropriate event 
       if(b.getToolTipText().equals("Set up simulation for normal execution")) { 
        fireSimulationEvent(SimulationEvent.NORMAL_SETUP_EVENT); 
       } 
       else if(b.getToolTipText().equals("Set up to test Queen Lifespan or Food Levels")) { 
        fireSimulationEvent(SimulationEvent.QUEEN_TEST_EVENT); 
       } 
       else if (b.getToolTipText().equals("Set up simulation for testing the Forager ant (Scouts are included)")) { 
        // set for testing the forager ant 
        fireSimulationEvent(SimulationEvent.FORAGER_TEST_EVENT); 
       } else if (b.getToolTipText().equals("Set up simulation for testing the Soldier ant (Scouts are included")) { 
        // set for testing the soldier ant 
        fireSimulationEvent(SimulationEvent.SOLDIER_TEST_EVENT); 
       } else if (b.getToolTipText().equals("Run the simulation continuously")) { 
        // run the simulation continuously 
        fireSimulationEvent(SimulationEvent.RUN_EVENT); 
       } else if (b.getToolTipText().equals("Step through the simulation one turn at a time")) { 
        // run the simulation one turn at a time 
        fireSimulationEvent(SimulationEvent.STEP_EVENT); 
       } else if (b.getToolTipText().equals("Stop or Pause the simulation")) { 
        //stop everything 
        fireSimulationEvent(SimulationEvent.STOP_EVENT); 
       } 
+0

Yes entworfen hat.' SetName' hilft dir bei einem kürzeren Anruf und einem String-Check. –

3

Ich denke, der beste Weg, um Ihren Code zu überarbeiten, ist Client-Eigenschaften eines Knopfes zu verwenden.

private static final String EVENT_TYPE = "event_type"; 

// button creation 
normalSetupButton = new JButton(); 
// set appropriate event for this button 
normalSetupButton.putClientProperty(EVENT_TYPE, SimulationEvent.NORMAL_SETUP_EVENT); 
// other init button routine 

//next button 
queenTestButton = new JButton(); 
queenTestButton.putClientProperty(EVENT_TYPE, SimulationEvent.QUEEN_TEST_EVENT); 
// other init button routine 

// same way for other buttons 


public void actionPerformed(ActionEvent e) { 
    // get the button that was pressed 
    JButton b = (JButton) e.getSource(); 
    SimulationEvent evt = (SimulationEvent) b.getClientProperty(EVENT_TYPE); 
    fireSimulationEvent(evt); 
} 

Das sieht besser aus als "if-else if" Kaskade;)

+0

Dieser ist der Beste .. Ich bin mir dessen nicht bewusst 'putClientProperty' Methode, wird es helfen, Bedingungen in 'actionPerformed' zu reduzieren –

+0

@Sergly Ich mag das auch! Vielen Dank! – IRGeekSauce

+0

Oder 'setActionCommand' das ist, was es für – MadProgrammer

1

Es gibt mehrere Möglichkeiten, wie Sie könnte dies erreichen

Sie könnten ...

Verwenden Sie einfach die source des ActionEvent

Action voting = new AbstractAction(){ 
    @Override 
    public void actionPerformed(ActionEvent e){ 
     if (e.getSource() == vote_up) { 
      //... 
     } else if (...) { 
      //... 
     } 
    } 
}; 

Dies könnte in Ordnung sein, wenn Sie einen Verweis auf die ursprünglichen Tasten haben

konnten Sie ...

Vergeben Sie einen actionCommand jeder Taste

JButton vote_up = new JButton(upvote); 
vote_up.setActionCommand("vote.up"); 
JButton vote_down = new JButton(downvote); 
vote_down .setActionCommand("vote.down"); 
//... 
Action voting = new AbstractAction(){ 
    @Override 
    public void actionPerformed(ActionEvent e){ 
     if ("vote.up".equals(e.getActionCommand())) { 
      //... 
     } else if (...) { 
      //... 
     } 
    } 
}; 

Sie könnten ...

Nutzen Sie die Action API und indiviual machen, selbst Aktionen für jede Taste enthalten ...

public class VoteUpAction extends AbstractAction { 

    public VoteUpAction() { 
     putValue(SMALL_ICON, new ImageIcon(getClass().getResource("vote_up.png"))); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // Specific action for up vote 
    } 

} 

Dann können Sie einfach verwenden

JButton vote_up = new JButton(new VoteUpAction()); 
//... 

Welche konfiguriert die Schaltfläche entsprechend den Eigenschaften der Action und löst die Methode actionPerformed aus, wenn die Schaltfläche ausgelöst wird. Auf diese Weise wissen Sie zu 100%, was Sie tun sollten/müssen, wenn die Methode actionPerformed ohne Zweifel aufgerufen wird.

Haben Sie einen genaueren Blick auf How to Use Actions um weitere Informationen zu

+0

Hmm. Wenn Sie für jede Schaltfläche eine andere Aktion verwenden, ist es besser, eine abstrakte Methode 'getEvent()' zu definieren und jede konkrete Aktion implementiert diese Methode, um das entsprechende Ereignis zurückzugeben. Also hat die Methode 'actionPerformed()' nur eine Zeile: 'fireSimulationEvent (getEvent())'. Die "if-else if" -Kaskade sieht hier wirklich schlecht aus. –

+0

Wenn Sie über die API "Action" sprechen, dann ist es wichtig, die 'actionPerformed'-Methode zu verwenden, um die Arbeit der' Action' zu erledigen. Dies macht sie zu einer eigenständigen Arbeitseinheit, das ist natürlich die Antwort alle Theorie und die Mittel, mit denen Sie implementieren, würden sich auf den Kontext beziehen. Natürlich könntest du den "event type" einfach an eine Instanz von 'SimulatorAction' übergeben, dann hast du 10 Zeilen Code;) – MadProgrammer