Java 多个按钮
Java Multiple Button
我的 Java 项目几乎不需要帮助。
我有大约 60 个按钮,每个按钮应该 运行 位于计算机中的另一个应用程序。我知道如何设置 mouseClicked 事件来执行此操作:
public void mouseClicked(MouseEvent e) {
try {
Process p = Runtime.getRuntime().exec("address");
} catch (IOException ex) {
Logger.getLogger(CustomAct1.class.getName()).log(Level.SEVERE, null, ex);
}
}
但我不知道如何在不为每个按钮创建单独的 class 的情况下为每个按钮设置不同的地址。我现在用这个:
CustomAct open = new CustomAct();
but1.addMouseListener(open);
但我也需要为 "but2"、"but3" 等做这件事。
提前致谢。
如果您使用的是 java 1.8,这里有一个非常好的教程,介绍如何使用 lambda 表达式使这更容易(并且可以说更干净):
http://www.codejava.net/java-core/the-java-language/java-8-lambda-listener-example
你可以这样做(来自教程):
button.addActionListener(e -> {
System.out.println("Handled Lambda listener");
System.out.println("Have fun!");
});
如果您想阅读有关 lambda 表达式的更多信息,请参阅 http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
请注意,这仅适用于 JDK 1.8+
首先使用 JButtons 创建一个数组,然后使用 getSource() 方法。
public void mouseClicked(MouseEvent event)
{
if(event.getSource() instanceof JButton)
{
(JButton)event.getSource().whatEverYouWantToDo();
}
}
一种方法是遍历所有按钮(这意味着您必须将它们保持在Array
/ Collection
中)。
然后,您的代码看起来像
for(Button b : yourButtonCollection){
CustomAct action = createCustomAction(b);
b.addMouseListener(action);
}
(我假设 CustomAct
扩展了 MouseListener
,因为您已经这样使用了)
另一种可能更简洁的方法是 扩展现有的 Button
class。
这样,您就不需要在创建按钮后遍历所有按钮。因此,这需要在创建按钮时知道可执行文件的路径。
您的自定义 class 可能如下所示:
public class ExecutorButton extends Button implements EventHandler<MouseEvent> {
private String myExecutable;
public ExecutorButton(String pathToExecutable) {
this.myExecutable = pathToExecutable;
this.addEventHandler(MouseEvent.MOUSE_CLICKED,this);
}
@Override
public void handle(MouseEvent event) {
System.out.println("Executing > "+myExecutable);
executeMyExecutable();
}
}
(上面的代码来自JavaFX,因为你没有说明你使用的是FX/Swing/AWT/...不过原理都是一样的。)
然后,创建您的按钮并指定其各自可执行文件的路径:
Button btn = new ExecutorButton("/path/to/executable");
我的 Java 项目几乎不需要帮助。
我有大约 60 个按钮,每个按钮应该 运行 位于计算机中的另一个应用程序。我知道如何设置 mouseClicked 事件来执行此操作:
public void mouseClicked(MouseEvent e) {
try {
Process p = Runtime.getRuntime().exec("address");
} catch (IOException ex) {
Logger.getLogger(CustomAct1.class.getName()).log(Level.SEVERE, null, ex);
}
}
但我不知道如何在不为每个按钮创建单独的 class 的情况下为每个按钮设置不同的地址。我现在用这个:
CustomAct open = new CustomAct();
but1.addMouseListener(open);
但我也需要为 "but2"、"but3" 等做这件事。
提前致谢。
如果您使用的是 java 1.8,这里有一个非常好的教程,介绍如何使用 lambda 表达式使这更容易(并且可以说更干净): http://www.codejava.net/java-core/the-java-language/java-8-lambda-listener-example
你可以这样做(来自教程):
button.addActionListener(e -> {
System.out.println("Handled Lambda listener");
System.out.println("Have fun!");
});
如果您想阅读有关 lambda 表达式的更多信息,请参阅 http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
请注意,这仅适用于 JDK 1.8+
首先使用 JButtons 创建一个数组,然后使用 getSource() 方法。
public void mouseClicked(MouseEvent event)
{
if(event.getSource() instanceof JButton)
{
(JButton)event.getSource().whatEverYouWantToDo();
}
}
一种方法是遍历所有按钮(这意味着您必须将它们保持在Array
/ Collection
中)。
然后,您的代码看起来像
for(Button b : yourButtonCollection){
CustomAct action = createCustomAction(b);
b.addMouseListener(action);
}
(我假设 CustomAct
扩展了 MouseListener
,因为您已经这样使用了)
另一种可能更简洁的方法是 扩展现有的 Button
class。
这样,您就不需要在创建按钮后遍历所有按钮。因此,这需要在创建按钮时知道可执行文件的路径。
您的自定义 class 可能如下所示:
public class ExecutorButton extends Button implements EventHandler<MouseEvent> {
private String myExecutable;
public ExecutorButton(String pathToExecutable) {
this.myExecutable = pathToExecutable;
this.addEventHandler(MouseEvent.MOUSE_CLICKED,this);
}
@Override
public void handle(MouseEvent event) {
System.out.println("Executing > "+myExecutable);
executeMyExecutable();
}
}
(上面的代码来自JavaFX,因为你没有说明你使用的是FX/Swing/AWT/...不过原理都是一样的。)
然后,创建您的按钮并指定其各自可执行文件的路径:
Button btn = new ExecutorButton("/path/to/executable");