【问题标题】:Need help implementing a listener for user input in my Java GUI需要帮助在我的 Java GUI 中实现用户输入监听器
【发布时间】:2019-07-22 13:59:32
【问题描述】:

我通过改编书中的代码设法将这个 GUI 组合在一起。我不确定如何在此代码中实现侦听器,因为它超出了我的水平,但我需要它们来更轻松地测试我的程序。我浏览了这个网站上类似的帖子,但是没有人使用与我相同的代码结构,我不确定如何在这些帖子上实施解决方案。

到目前为止,我已经尝试使用 JCheckbox.addActionListener(this);,这是 oracle 网站所说的。无论我把这个语句放在哪里,我都会遇到各种各样的错误,我不知道为什么。

package inputform;

import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionListener;

public class Traitform extends JFrame implements ActionListener{

        JPanel row1 = new JPanel();
        JCheckBox eye1 = new JCheckBox("Brown");
        JCheckBox eye2 = new JCheckBox("Blue");
        JCheckBox eye3 = new JCheckBox("Green");
        JCheckBox eye4 = new JCheckBox("Hazel");

        JPanel row2 = new JPanel();
        JCheckBox hair1 = new JCheckBox("Brown");
        JCheckBox hair2 = new JCheckBox("Blonde");
        JCheckBox hair3 = new JCheckBox("Ginger");
        JCheckBox hair4 = new JCheckBox("Black");

        JPanel row3 = new JPanel();
        JCheckBox eye5 = new JCheckBox("Brown");
        JCheckBox eye6 = new JCheckBox("Blue");
        JCheckBox eye7 = new JCheckBox("Green");
        JCheckBox eye8 = new JCheckBox("Hazel");

        JPanel row4 = new JPanel();
        JCheckBox hair5 = new JCheckBox("Brown");
        JCheckBox hair6 = new JCheckBox("Blonde");
        JCheckBox hair7 = new JCheckBox("Ginger");
        JCheckBox hair8 = new JCheckBox("Black"); 


        public Traitform () {
            super("Parent Trait Form");
            setSize(1000, 1000);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            GridLayout layout = new GridLayout(0,1);
            setLayout(layout);

            row1.add(eye1);
            row1.add(eye2);
            row1.add(eye3);
            row1.add(eye4);

            row3.add(eye5);
            row3.add(eye6);
            row3.add(eye7);
            row3.add(eye8);

            row2.add(hair1);
            row2.add(hair2);
            row2.add(hair3);
            row2.add(hair4);

            row4.add(hair5);
            row4.add(hair6);
            row4.add(hair7);
            row4.add(hair8);


            add(row1);
            add(row2);
            add(row3);
            add(row4);


            setVisible(true);
        }

    private static void setLookAndFeel() {
        try{
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                } catch (Exception exc){

            }
    }
        public static void main(String[] arguments){
            Traitform.setLookAndFeel();
            Traitform frame = new Traitform();

        }
        @Override
        public void actionPerformed(ActionListener e){
            System.out.println("action");
        }
} 

我需要这个程序从复选框中获取用户输入,以便它可以在我的程序的另一个部分中的单独包中使用。当我运行当前代码时,我收到错误无法编译的程序。

【问题讨论】:

  • 看起来像是首选项文件的用例,甚至可能是数据库。您需要在某处保留这些值,以便在程序启动时 setLookAndFeel (main)。
  • 这是来自 oracle 的代码:docs.oracle.com/javase/tutorial/uiswing/events/… public AL(String title) { super(title); setLayout(new FlowLayout()); addWindowListener(this); b = new Button("Click me"); add(b); add(text); b.addActionListener(this); 好像我只需要将它实现到我现有的代码中。
  • 仅供参考,您不需要 ButtonGroups,它们用于您不使用的单选按钮组。

标签: java swing user-interface listener


【解决方案1】:

这显然是错误的:

JCheckbox.addActionListener(this);

addActionListener 不是静态方法。另外,您可能想在检查不同的复选框时做不同的事情。

所以你应该这样做:

hair5.addActionListener(() -> {System.out.println("hair5 clicked")});

您还可以为所有复选框添加单个操作侦听器。例如,将所有复选框放在一个列表中,然后执行以下操作:

ActionListener myActionListener = () -> {System.out.println("my action listener")}
for (checkbox: checkboxList) {
    checkbox.addActionListener(myActionListener);
}

【讨论】:

  • 那么我可以为变量分配一个整数值,而不是{System.out.println("hair5 clicked")},然后将该整数值导入到不同的包中吗?例如{int haircolor = 4 } ?
  • 是的,您可以在侦听器中执行任何 java 代码。它就像任何其他方法调用一样。
  • 我尝试了你的第一行代码,由于某种原因,我收到一条错误消息“;”预期和“lambda 表达式中不兼容的参数类型。”
【解决方案2】:

addActionListener() 方法的参数是ActionListner(参见doc)。
所以也使用eye1.addActionListener(this);(例如)this需要是ActionListnerActionListener 是一个接口,这意味着 this this 需要实现 ActionListener.
this ,在你的情况下是 traitform 类(应该是 TraitformJava naming conventions):

将类定义改为

public class Traitform extends JFrame implements ActionListener{

您需要添加实现。在这种情况下,它是一种方法:

@Override
public void actionPerformed(ActionEvent e) {
    // what ever you write here is invoked when action listener is used.
    System.out.println("Action listener fired !");
}

按照上面的示例 (eye1.addActionListener(this);),actionPerformed 方法在 eye1 触发 ActionEvent 时被调用。

【讨论】:

  • 我刚刚更新了我的代码,试图实现您提供的内容。添加实现 JFrame 给我一个错误,说 Traitform 不是抽象的。 @Override 给我一个错误“没有实现超类型的方法”
  • actionPerformed 需要一个 ActionEvent 参数。在您的代码中将 actionPerformed(ActionListener e) 更改为 actionPerformed(ActionEvent e)
猜你喜欢
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多