当前位置: 首页 > 知识库问答 >
问题:

来自另一个类的JButton操作侦听器

于正志
2023-03-14

我正在处理JButton事件。我有一个JPanel类,我们叫Panel1,包含一个公共的JButton,我们叫它Button1。单击此按钮时:

//Inside Panel1
Button1.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e)
   {
      System.out.println("1")
   }
});
//Inside Panel2
Panel1.Button1.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e)
   {
      System.out.println("2")
   }
});
2
1

但我有兴趣:

1
2

有什么建议吗?

共有1个答案

柳仲卿
2023-03-14

如果您将ActionListeners添加到JButton中,您无法保证它们将触发的顺序,并且知道添加的顺序并不能保证有帮助。解决这一问题的一种方法是使用ActionListener更改对象的状态,然后监听该状态。这将保证ActionListener首先触发。

例如,使用PropertyChangeListener作为第二个侦听器:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.*;

public class ActionOrder extends JPanel {
   ButtonPanel buttonPanel = new ButtonPanel();
   OtherPanel otherPanel = new OtherPanel();

   public ActionOrder() {
      add(buttonPanel);
      add(otherPanel);

      buttonPanel.addPropertyChangeListener(ButtonPanel.PRESSED, new PropertyChangeListener() {

         @Override
         public void propertyChange(PropertyChangeEvent evt) {
            otherPanel.appendText("Button 1 Pressed");
         }
      });
   }

   private static void createAndShowGui() {
      ActionOrder mainPanel = new ActionOrder();

      JFrame frame = new JFrame("ActionOrder");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}


class ButtonPanel extends JPanel {
   public static final String PRESSED = "pressed";
   private JButton button1 = new JButton("Button 1");

   public ButtonPanel() {
      add(button1);
      button1.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            System.out.println("1");
            firePropertyChange(PRESSED, null, PRESSED);
         }
      });

      setBorder(BorderFactory.createTitledBorder("Button Panel"));
   }
}

class OtherPanel extends JPanel {
   private JTextArea textArea = new JTextArea(10, 20);

   public OtherPanel() {
      add(new JScrollPane(textArea));
      setBorder(BorderFactory.createTitledBorder("Other Panel"));
   }

   public void appendText(String text) {
      textArea.append(text + "\n");
      System.out.println("2");
      System.out.println();
   }
}
 类似资料:
  • 问题内容: 我有两个分别称为“左”和“右”。“左”按钮将矩形对象向左移动,“右”按钮将其向右移动。我在班上有一个充当单击任一按钮时的侦听器。但是,我希望单击每个动作时都会发生不同的动作。如何区分点击的? 问题答案: 将actionCommand设置到每个按钮。 //将动作命令设置到两个按钮上。 更新:

  • 问题内容: 可能有两堂课,而在一堂课中 在另一个 //更多原因是因为我需要将按钮(摆动)分离到动作监听器 我该怎么办? 谢谢 问题答案: 不仅可以将这两个部分分开,而且还建议这样做(请参阅MVC模式-非常有关分离屏幕控件(如按钮)和程序逻辑) 我想到的最简单的方法是编写一个实现接口的命名类,如下所示: 然后将其添加到您的按钮:

  • 导入javax.swing.*; class Labels extensions JFrame{ JPanel pnl = new JPanel(); } 如果我想将其用作JApplet怎么办?必须做什么?很难更改吗? JFrame上运行的东西和JApplet上的东西是一样的吗?

  • 下面的代码是项目的动作侦听器。基本上,我有 4 个单选按钮,当我单击一个时,我希望它更改屏幕上的变量。当我运行代码时,它只是将所有值相加。还有其他方法可以做到这一点吗?

  • 问题内容: 我怎样才能使它成为特定方法? (我知道可以用一种方法将其全部抛弃,是的。 谢谢你们, 编辑:谢谢大家的快速反应,我的解释不是很清楚。 我调查了lambda的使用,这几乎是我在想的,尽管其他方式也很不错。 再次谢谢大家。 下次我会尝试变得更清晰,更快捷。 问题答案: 同样,您的问题仍然不清楚。您上面的代码 有 一种方法,可以将代码放入其中: 或者,您可以从该方法中调用外部类的方法: 或者

  • 需要帮助!关于Salesforce Apex计划课程的问题。 我需要从视觉力页面调用一个动作,该动作位于顶点类上。顶点类太长了,但动作完全从VF页面工作。 下面是代码的示例版本。但计划类不起作用,只需不断给出错误以保存即可。 VF页面 以下是我无法使用的代码: 任何人都知道如何从VF或Apex类调用操作