java swing user-interface awt

java - Cómo definir múltiples acciones JButton desde una clase diferente



swing user-interface (1)

Use Action para encapsular la funcionalidad para usarla en otros lugares de su programa, por ejemplo, botones, menús y barras de herramientas. El BeaconPanel muestra a continuación exporta varias acciones que facilitan su uso en un panel de control. Para limitar la proliferación de instancias, las acciones mismas pueden ser miembros de la clase. Como ejercicio, cambie los controls a un JToolBar o agregue las mismas acciones a un menú.

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

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

Estoy escribiendo un programa donde necesito hacer diferentes acciones para una clase separada dependiendo de qué botón se haga clic.

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

Algo como esto. Tenga en cuenta que soy completamente novato en el diseño de GUI.