Java 单击按钮执行操作的最佳/最简单解决方案是什么?

Java 单击按钮执行操作的最佳/最简单解决方案是什么?,java,button,processing,Java,Button,Processing,我正在处理创建自己的API,包括按钮等。但是我做了按钮,我做了所有关于测试的事情,当你的鼠标在按钮上时,。。。但问题是,我真的不知道如何启动按钮动作的方法 我看到了基本的JavaAPI是如何工作的——有ActionListener之类的——但我就是不喜欢它。我不想要我自己的代码——或者至少是我能理解的代码 所以我想要一个按钮,当它被点击时启动一个方法,当鼠标悬停时,我得到一个布尔值true。。。那很好 我发现了一些关于反射API和使用method.invoke;,但是有些人说这会减慢程序的速度,

我正在处理创建自己的API,包括按钮等。但是我做了按钮,我做了所有关于测试的事情,当你的鼠标在按钮上时,。。。但问题是,我真的不知道如何启动按钮动作的方法

我看到了基本的JavaAPI是如何工作的——有ActionListener之类的——但我就是不喜欢它。我不想要我自己的代码——或者至少是我能理解的代码

所以我想要一个按钮,当它被点击时启动一个方法,当鼠标悬停时,我得到一个布尔值true。。。那很好

我发现了一些关于反射API和使用method.invoke;,但是有些人说这会减慢程序的速度,或者对私人方法是危险的

我看到有人在谈论方法;whitch显然可以用来调用一个方法?我搜索了一下,没有找到更多的东西


所以这更多的是一个思考问题,而不是一个代码问题,我不是在问代码,但更多的是,你将如何创建一个任何人都可以使用的按钮,它将有一个由方法象征的特定动作。更准确地说,如何启动该方法。

我不确定我是否100%理解了这个问题,但实际上,使用ActionListener,您可以进行自定义操作并调用您需要的任何方法,也可以使用MouseListener

例如:

public class MyFrame extends JFrame {
    private CustomButton customButton;

    public static void main(String[] args) {
        MyFrame frame = new MyFrame();
        frame.setTitle("Testing MyFrame");
        frame.createGUI();
        frame.pack();
        frame.setVisible(true);
    }

    private void createGUI() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new FlowLayout());
        customButton = new CustomButton("Perform Custom Action");
        add(customButton);
    }
}
另外,您还可以在CustomButton类之外创建一个自定义ActionListener或多个ActionListener和/或自定义MouseListener或多个,和/或您还可以“分配”将它们添加到CustomButton类之外的自定义按钮

p.p.S.但如果您想知道如何制作自定义事件侦听器,这是另一个问题:


其他答案和评论都是关于纯Java的,但您使用的是处理。您在处理过程中采用的方法将少一些。。。比您在Java中使用的方法更先进

然而,简而言之:你想得太多了

您应该首先查看现有的处理GUI库。真正的答案可能是使用其中一个,因为所有这些工作都已经为您完成了

但是,如果您真的想创建自己的gui api,那么可以归结为以下几点:

每个组件都应该能够自己绘制。 您需要钩住顶级事件,如mouseClicked或mouseMoved,迭代组件,并调用事件函数。 如果您想传递按钮在单击时调用的方法,那么您可以简单地提供一个button类的用户可以实现的接口。 完全没有必要使用反射来实现这一点。下面是一个简单的例子:

interface ClickAction {
  public void clicked();
}

class Button {

  float x;
  float y;
  float width;
  float height;
  ClickAction action;

  public Button(float x, float y, float width, float height, ClickAction action) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
    this.action = action;
  }

  void draw() {
    rect(x, y, width, height);
  }

  void click() {
    action.clicked();
  }
}

ArrayList<Button> buttons = new ArrayList<Button>();

void setup() {

  ClickAction action1 = new ClickAction() {
    public void clicked() {
      println("Clicked button one.");
    }
  };

  ClickAction action2 = new ClickAction() {
    public void clicked() {
      println("Clicked button two.");
    }
  };

  buttons.add(new Button(25, 25, 50, 20, action1));
  buttons.add(new Button(50, 60, 20, 40, action2));
}

void mouseClicked() {
  for (Button b : buttons) {
    if (mouseX > b.x && mouseX < b.x+b.width) {
      if (mouseY > b.y && mouseY < b.y+b.height) {
        b.click();
      }
    }
  }
}

void draw() {
  background(0);

  for (Button b : buttons) {
    b.draw();
  }
}
这是非常基本的面向对象代码,不需要使用反射来使事情过于复杂。只需像使用对象一样使用它们


请注意,这种方法与Swing使用的方法非常相似:JButton类可以有ActionListener,当单击按钮时会调用它。

了解Java现有的GUI框架之一。不需要重新发明轮子。键盘控件呢?从概念上讲,你要做的是实现某种类型的,这正是我想要做的,我的问题是,我不知道可以同时创建一个类实例和声明一个方法,就像你对action1和action2所做的那样…@ElzearContelly这些只是匿名类。这与创建一个实现ClickAction的类完全一样,只需要更少的代码行。Java8使这变得更加简单。
interface ClickAction {
  public void clicked();
}

class Button {

  float x;
  float y;
  float width;
  float height;
  ClickAction action;

  public Button(float x, float y, float width, float height, ClickAction action) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
    this.action = action;
  }

  void draw() {
    rect(x, y, width, height);
  }

  void click() {
    action.clicked();
  }
}

ArrayList<Button> buttons = new ArrayList<Button>();

void setup() {

  ClickAction action1 = new ClickAction() {
    public void clicked() {
      println("Clicked button one.");
    }
  };

  ClickAction action2 = new ClickAction() {
    public void clicked() {
      println("Clicked button two.");
    }
  };

  buttons.add(new Button(25, 25, 50, 20, action1));
  buttons.add(new Button(50, 60, 20, 40, action2));
}

void mouseClicked() {
  for (Button b : buttons) {
    if (mouseX > b.x && mouseX < b.x+b.width) {
      if (mouseY > b.y && mouseY < b.y+b.height) {
        b.click();
      }
    }
  }
}

void draw() {
  background(0);

  for (Button b : buttons) {
    b.draw();
  }
}