有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing需要帮助在我的Java GUI中实现用户输入的侦听器

我通过改编一本书中的代码,成功地将这个GUI组装在一起。我不确定如何将侦听器实现到这段代码中,因为它高于我的级别,但我需要它们使测试程序更容易。我浏览了这个网站上类似的帖子,但是没有人使用与我相同的代码结构,我不知道如何在这些帖子上实现解决方案

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

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

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


共 (2) 个答案

  1. # 1 楼答案

    addActionListener()方法的参数是ActionListner(参见doc
    所以也使用eye1.addActionListener(this);(例如)this需要是ActionListnerActionListener是一个接口,这意味着this{}需要实现ActionListener
    this,在你的例子中是traitform类(应该是Traitform参见Java 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);),当eye1触发ActionEvent时,调用actionPerformed方法

  2. # 2 楼答案

    这显然是错误的:

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