Есть несколько способов, вы могли бы это сделать, один может быть, чтобы разработать общий интерфейс, который вся ваша «команде» должен были бы осуществить, он будет иметь один метод, который может выполнить ваш ActionListener
.
Например ...
public interface Command {
public void execute();
}
Вы бы тогда в вашем UI в Map
который будет сопоставить actionCommand
сек экземплярам Command
s
public class ... extends ... {
private Map<String, Command> commands = new HashMap<>(25);
//...
Теперь вы можете иметь хороший " add ", который позволит вам динамически добавлять команды, создавая новую JButton
для каждой новой команды или просто настраивая ее самостоятельно в соответствии с вашими потребностями
Затем в ActionListener
, вы бы просто получить actionCommand
недвижимость, посмотреть вверх Command
в Map
и execute
его, если он действует
@Override
public void actionPerformed(ActionEvent e) {
Command cmd = commands.get(e.getActionCommand());
if (cmd != null) {
cmd.execute();
}
}
Например ...
package javaapplication659;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestCommand {
public static void main(String[] args) {
new TestCommand();
}
public TestCommand() {
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 {
private Map<String, Command> commands = new HashMap<>(25);
private ActionListener actionListener;
private GridBagConstraints gbc;
public TestPane() {
setLayout(new GridBagLayout());
gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(1, 1, 1, 1);
actionListener = new ActionHandler();
add("Take over the world", new Command() {
@Override
public void execute() {
System.out.println("Take over the world");
}
});
add("Quwell up rising", new Command() {
@Override
public void execute() {
System.out.println("Bring the boot down");
}
});
add("Buy milk", new Command() {
@Override
public void execute() {
System.out.println("Buy milk");
}
});
}
public void add(String text, Command cmd) {
JButton btn = new JButton(text);
btn.addActionListener(actionListener);
commands.put(text, cmd);
add(btn, gbc);
}
public class ActionHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Command cmd = commands.get(e.getActionCommand());
if (cmd != null) {
cmd.execute();
}
}
}
}
public interface Command {
public void execute();
}
}
Теперь, это довольно простой пример, и может быть гораздо более сложным, в зависимости от ваших потребностей, но она демонстрирует основную идею
Вид, я бы очень рекомендую это, вероятно, не .. Вы могли бы взгляните на [Reflection API] (https://docs.oracle.com/javase/tutorial/reflect/), или вы можете использовать «Map», который содержит общую реализацию интерфейса, с требуемым методом, который основан на на вашем 'Action' или' actionCommand', смог бы посмотреть, какой экземпляр он должен выполнить, что было бы лучше, чем при использовании рефлекса. – MadProgrammer
@MadProgrammer. Звучит гораздо веселее, чем отражение, но я даже не коснулся карт до. Так вы говорите, чтобы использовать setActionMap на кнопке или дать классу ActionListener карту и использовать строку из команды действий в качестве ключей для поиска метода? – nonprofitgibi
Как правило, у вас будет поле «Карта» в качестве поля экземпляра, ключ которого будет сопоставляться с свойством 'actionCommand'' JButton', поэтому при выполнении вы просматриваете команду и выполняете ее метод – MadProgrammer