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

时间:2015-12-24 22:19:37

标签: java button processing

我正在处理Processing以创建我自己的API,带有按钮等。然而我做了按钮,当鼠标悬停在按钮上时,我做了一些关于测试的事情......但事实是,我真的不知道如何启动按钮动作的方法。

我看到了基本Java API如何使用ActionListener等 - 但我只是不喜欢它。我不是我自己的代码 - 至少是我理解的代码。

所以我想要一个按钮,当它被点击时启动一个方法,我有一个布尔值(当鼠标悬停时它是真的......这样可以正常工作。)

我发现了一些关于反射API的东西,并使用了method.invoke();但是有些人说这会减慢程序的速度或对私有方法造成危险。

我看到有人谈论方法();显然可以用来调用方法?我搜索了它,但没有找到更多。

所以这更像是一个思考问题,而不是代码问题,我不是要求代码,而是更多,你将如何创建一个任何人都可以使用的按钮,并且会有一个方法符号化的特定动作。更确切地说,如何启动该方法。

2 个答案:

答案 0 :(得分:-1)

我不确定我是否理解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);
    }
}
public class CustomButton extends JButton {

    public CustomButton(String text) {
        super(text);
        this.addActionListener(new CustomAction());
        this.addMouseListener(new CustomMouseAction());
    }

    private void doSomething() {
        doSomething("Custom Button Clicked!");
    }

    private void doSomething(String message) {
        System.out.println(message);
    }

    private class CustomAction implements ActionListener {
         @Override
        public void actionPerformed(ActionEvent ae) {
            doSomething();
        }
    }

    private class CustomMouseAction implements MouseListener {
        @Override
        public void mouseClicked(MouseEvent me) {
            doSomething("Mouse clicked on Custom Button");
        }

        @Override
        public void mousePressed(MouseEvent me) {
            doSomething("Mouse pressed on Custom Button");
        }

        @Override
        public void mouseReleased(MouseEvent me) {
            doSomething("Mouse released on Custom Button");
        }

        @Override
        public void mouseEntered(MouseEvent me) {
            doSomething("Mouse entered on Custom Button");
        }

        @Override
        public void mouseExited(MouseEvent me) {
            doSomething("Mouse exited the Custom Button");
        }
    }
}

P.S。您还可以在CustomButton类之外创建自定义ActionListener(或多个ActionListener)和/或自定义MouseListener(或多个),和/或您也可以分配' (添加)它们到CustomButton类之外的自定义按钮。

P.P.S。但是,如果您想知道如何制作自定义事件监听器,那么这是另一个问题: http://wiki.bukkit.org/Event_API_Reference

http://www.javaworld.com/article/2077333/core-java/mr-happy-object-teaches-custom-events.html

答案 1 :(得分:-1)

其他答案和评论都在谈论直接Java,但您正在使用Processing。您在Processing中采用的方法将比您在Java中使用的方法更少......

然而,简而言之:你过度思考它。

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

然而,如果你真的想创建自己的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类可以在单击按钮时调用ActionListeners