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