当前位置: 首页 > 面试题库 >

JFrame在单独的类中,那么ActionListener呢?

百里俭
2023-03-14
问题内容

我试图将我的Swing GUI与实际代码分开。简而言之,我希望用户启动一个过程(基于用户的选择);在这种情况下,将不再需要JFrame。

我不知道的是如何与Main.class共享来自GUI.class的用户选择。

您对我有什么建议吗?

这是我的代码:

public class Main {
  public static void main(String[] args) {
    // Show GUI
    java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
        GUI gui = new GUI(templates);
        gui.setVisible(true);
      }
    });

    // Kick off a process based on the user's selection
  }
}

public class GUI extends JFrame {
  private static final long serialVersionUID = 1L;

  public GUI(Object[] objects) {
    setTitle("GUI");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 350, 100);
    setLocationRelativeTo(null);

    JPanel cp = new JPanel();
    cp.setBorder(new EmptyBorder(10, 10, 10, 10));
    setContentPane(cp);

    JLabel lbl = new JLabel("Selection:");
    cp.add(lbl);

    final JComboBox<String> comboBox = new JComboBox<String>(new String[] { "One", "Two", "Three" });
    comboBox.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        setVisible(false);
        dispose();
        // Share the selected item with Main.class
      }
    });
    cp.add(comboBox);
  }
}

问题答案:

一个很好的方法是使用 Callback 机制

遵循的步骤:

  • 创建一个回调接口

    interface Callback {
    void execute(Object result);
    

    }

  • GUI类将实现Callback接口,但不提供任何实现

  • 制作GUIabstract

    abstract class GUI extends JFrame implements Callback
    
  • 现在创建一个GUI类的对象,提供Callback接口的实际实现

  • 在这里你可以使用匿名类

    GUI gui = new GUI() {
    
    @Override
    public void execute(Object result) {
        System.out.println("You have selected " + result);
    }
    

    };

  • 您可以通过的execute()方法传递任何内容Callback

    comboBox.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        setVisible(false);
        dispose();
        // Share the selected item with Main.class
        // Callback
        execute(comboBox.getSelectedItem());
    }
    

    });

在这里,Main类负责捕获CallbackGUI类指示的响应。

这是代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class Main {
    public static void main(String[] args) {
        // Show GUI
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                GUI gui = new GUI() {

                    @Override
                    public void execute(Object result) {
                        System.out.println("You have selected " + result);
                    }

                };
                gui.setVisible(true);
            }
        });

        // Kick off a process based on the user's selection
    }
}

interface Callback {
    void execute(Object result);
}

abstract class GUI extends JFrame implements Callback {
    private static final long serialVersionUID = 1L;

    public GUI() {
        setTitle("GUI");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 350, 100);
        setLocationRelativeTo(null);

        JPanel cp = new JPanel();
        cp.setBorder(new EmptyBorder(10, 10, 10, 10));
        setContentPane(cp);

        JLabel lbl = new JLabel("Selection:");
        cp.add(lbl);

        final JComboBox comboBox = new JComboBox(new String[] { "One", "Two", "Three" });
        comboBox.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                setVisible(false);
                dispose();
                // Share the selected item with Main.class
                execute(comboBox.getSelectedItem());
            }
        });
        cp.add(comboBox);
    }

}


 类似资料:
  • 如何在java摆中从第二个JFrame获取数据?我有一个带有JLabel和JButton的帧。单击JButton时,它会打开另一个带有自定义日历的帧。我想选择日期(通过JButton)并将日期放在主JFrame的JLabel中。我不想创建第一帧的新实例,因为还有其他用户可能键入的我不想删除的信息。

  • 我在一个父类中与Java中的ActionListener作斗争,我尝试了一系列可能的解决方案,但都无法使其工作。这在这里也没有帮助:Java actionlistener在不同的类中执行actionPerformed 问题如下: 父类 子类

  • 我在一个java应用程序上工作。我想在箭头键上实现一个KeyListener。我有一个扩展JFrame并实现ActionListener的类

  • 我写的程序有问题。我把你放在上下文中... 我尝试在这个程序中实现:MVC模式,因此,基本上,我将这些类分离在不同的包中。 我有一个:视图和控制器包,在视图包中我有:UserInterface类,它扩展了JFrame,并包含:JMenuBar、jMenus和JMenuItem。。。 你可以用JMenuItem添加标签,这个JMenuItem,获取并添加一个: ActionListener,这个ac

  • 我创建了一个DefaultTableModel,它在JTabbedPane中显示了一个非常基本的用户列表。 这是显示和它的好,但谁能指导我使用什么语法来添加行,我已经尝试过: 但这不起作用,eclipse要求我向Statistics类添加一个名为“add row”的方法,但我以为“add row”已经是DefaultTableModel的方法了,所以我很困惑。有没有人能帮助我如何将一行数据添加到表