2016-05-06 6 views
-1

Ich schreibe ein Programm, in dem ich verschiedene Aktionen für eine separate Klasse ausführen muss, je nachdem, auf welche Schaltfläche geklickt wird.So definieren Sie mehrere JButton-Aktionen aus einer anderen Klasse

public class NewJFrame{ 
    public static JButton b1; 
    public static JButton b2; 
    public static JButton b3; 
} 

public class Slot{ 

    int value; 
    JButton button; 

    Slot(int value, JButton button) 
    { 
     this.value=value; 
     this.button=button; 
    } 
} 

public class Game{ 
    Slot[] slots=new Slot[3]; 
    Game(){ 
     slots[0]=new Slot(1,NewJFrame.b1); 
     slots[1]=new Slot(2,NewJFrame.b2); 
     slots[2]=new Slot(3,NewJFrame.b3); 
    } 
    public void actionPerformed(ActionEvent e) { 
     for(int i=0;i<3;i++){ 
      if(e.getSource()==slots[i].button) 
       slots[i].button.setText(String.valueOf(value)); 
     } 
    } 
} 

So etwas wie das. Beachten Sie, dass ich beim GUI-Design völlig neu bin.

+1

bitten Sie bitte eine spezifischere Frage. Bislang haben Sie lediglich einige vage übermäßige Anforderungen formuliert. Je spezifischer Ihre Frage, desto besser und spezifischer ist die Antwort. Weitere Informationen dazu, wie Sie Ihre Frage verbessern und Ihre Chancen erhöhen können, finden Sie in den Abschnitten [Hilfe] sowie in den Abschnitten [Fragen stellen] (http://stackoverflow.com/help/how-to-ask) um anständige Hilfe zu bekommen. –

+1

Unrelated recs: Keines der obigen Felder sollte statisch sein, insbesondere JButtons. Klassennamen sollten mit Großbuchstaben beginnen, damit sie den Java-Namenskonventionen entsprechen. Wenn Sie dies so tun, werden andere Ihren Code und Ihr Problem besser verstehen. –

+1

Danke für die Umbenennung, aber die wichtigere Korrektur besteht darin, Ihre Frage zu verbessern, damit sie leichter zu verstehen und zu beantworten ist. –

Antwort

5

Verwenden Sie Action, um Funktionen zur Verwendung an anderer Stelle in Ihrem Programm, z. Schaltflächen, Menüs und Symbolleisten. Die unten gezeigte BeaconPanel exportiert mehrere Aktionen, die die Verwendung in einem Steuerungsfeld erleichtern. Um die Verbreitung von Instanzen zu begrenzen, können die Aktionen selbst Klassenmitglieder sein. Ändern Sie als Übung controls in JToolBar oder fügen Sie demselben Menü dieselben Aktionen hinzu.

JPanel controls = new JPanel(); 
controls.add(new JButton(beaconPanel.getFlashAction())); 
controls.add(new JButton(beaconPanel.getOnAction())); 
controls.add(new JButton(beaconPanel.getOffAction())); 

image

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Ellipse2D; 
import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.Timer; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

/** @see http://stackoverflow.com/a/37063037/230513 */ 
public class Beacon { 

    private static class BeaconPanel extends JPanel { 

     private static final int N = 16; 
     private final Ellipse2D.Double ball = new Ellipse2D.Double(); 
     private final Timer timer; 
     private final Color on; 
     private final Color off; 
     private final AbstractAction flashAction = new AbstractAction("Flash") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       timer.restart(); 
      } 
     }; 
     private final AbstractAction onAction = new AbstractAction("On") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       stop(on); 
      } 
     }; 
     private final AbstractAction offAction = new AbstractAction("Off") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       stop(off); 
      } 
     }; 
     private Color currentColor; 

     public BeaconPanel(Color on, Color off) { 
      this.on = on; 
      this.off = off; 
      this.currentColor = on; 
      timer = new Timer(500, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        changeColors(); 
       } 
      }); 
     } 

     public void start() { 
      timer.start(); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D) g; 
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
      int x = getX() + N; 
      int y = getY() + N; 
      int w = getWidth() - 2 * N; 
      int h = getHeight() - 2 * N; 
      ball.setFrame(x, y, w, h); 
      g2.setColor(currentColor); 
      g2.fill(ball); 
      g2.setColor(Color.black); 
      g2.draw(ball); 
     } 

     private void changeColors() { 
      currentColor = currentColor == on ? off : on; 
      repaint(); 
     } 

     private void stop(Color color) { 
      timer.stop(); 
      currentColor = color; 
      repaint(); 
     } 

     public Action getFlashAction() { 
      return flashAction; 
     } 

     public Action getOnAction() { 
      return onAction; 
     } 

     public Action getOffAction() { 
      return offAction; 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(N * N, N * N); 
     } 
    } 

    public static void display() { 
     JFrame f = new JFrame("Beacon"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final BeaconPanel beaconPanel = new BeaconPanel(Color.orange, Color.orange.darker()); 
     f.add(beaconPanel); 
     JPanel controls = new JPanel(); 
     controls.add(new JButton(beaconPanel.getFlashAction())); 
     controls.add(new JButton(beaconPanel.getOnAction())); 
     controls.add(new JButton(beaconPanel.getOffAction())); 
     f.add(controls, BorderLayout.SOUTH); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
     beaconPanel.start(); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Beacon.display(); 
      } 
     }); 
    } 
} 
+0

Überlegen Sie auch, eine 'Liste ' zu exportieren. – trashgod