java - 退出按钮不起作用

标签 java swing windowbuilder

深入了解 GUI 并尝试让事情变得简单。然而,我似乎只做一个简单的“退出”按钮。我正在使用 Eclipse 的 WindowsBuilder 插件来帮助我。

private void initialize()
{
    mainWindowFrame = new JFrame();
    mainWindowFrame.setTitle("Lock and Log");
    mainWindowFrame.setIconImage(Toolkit.getDefaultToolkit().getImage(MainWindow.class.getResource("/lockandlog/main/resources/icon.png")));
    mainWindowFrame.setResizable(false);
    mainWindowFrame.setBounds(100, 100, 854, 480);
    mainWindowFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainWindowFrame.getContentPane().setLayout(null);

    final JTextArea logDisplay = new JTextArea();
    logDisplay.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 0)));
    logDisplay.setEditable(false);
    logDisplay.setBounds(259, 11, 579, 250);
    mainWindowFrame.getContentPane().add(logDisplay);

    JLabel viewCmdDisplayLbl = new JLabel("View Command Display:");
    viewCmdDisplayLbl.setFont(new Font("Tahoma", Font.BOLD, 11));
    viewCmdDisplayLbl.setBounds(259, 272, 133, 14);
    mainWindowFrame.getContentPane().add(viewCmdDisplayLbl);

    JTextArea textArea = new JTextArea();
    textArea.setEditable(false);
    textArea.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 0)));
    textArea.setBounds(259, 297, 579, 104);
    mainWindowFrame.getContentPane().add(textArea);

    JToolBar toolBar = new JToolBar();
    toolBar.setBounds(0, 412, 848, 16);
    mainWindowFrame.getContentPane().add(toolBar);

    JPanel manualGrp = new JPanel();
    manualGrp.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));
    manualGrp.setBounds(10, 11, 239, 72);
    mainWindowFrame.getContentPane().add(manualGrp);
    manualGrp.setLayout(null);

    manualTxt = new JTextField();
    manualTxt.setBounds(10, 7, 219, 20);
    manualGrp.add(manualTxt);
    manualTxt.setColumns(10);

    JButton manualBtn = new JButton("Manual Override");
    manualBtn.setFont(new Font("Tahoma", Font.BOLD, 12));
    manualBtn.setBounds(10, 38, 219, 23);
    manualGrp.add(manualBtn);

    JMenuBar menuBar = new JMenuBar();
    mainWindowFrame.setJMenuBar(menuBar);

    final JMenu fileBtn = new JMenu("File");
    fileBtn.addMouseListener(new MouseAdapter() //This works
    {
        @Override
        public void mouseEntered(MouseEvent e)
        {
            fileBtn.setSelected(true);
        }
        @Override
        public void mouseExited(MouseEvent e)
        {
            fileBtn.setSelected(false);
        }
    });
    menuBar.add(fileBtn);

    JMenuItem exitBtn = new JMenuItem("Exit");
    //Code is definitely passing through here.
    exitBtn.addMouseListener(new MouseAdapter() //This doesn't work?
    {
        @Override
        public void mouseClicked(MouseEvent e)
        {
            logDisplay.setText("Test"); //This isn't even being called!
            System.exit(0);
        }
    });
    //Definitely adds the button so code is passing through here.
    fileBtn.add(exitBtn);
}

这就是现在的整个初始化类。但是,如果您注意到在底部附近,我有一个“退出”按钮的事件,如果您单击它,程序应该关闭。除了,当我点击按钮时什么也没有发生。尝试其他类似 fileBtn 中的事件,效果很好。那么我做错了什么?

最佳答案

不要使用 mouseListener,使用 ActionListener。

import java.awt.event.*;


public class SOQ3
{
   JFrame mainWindowFrame;

   public static void main(String[] args)
   {

      SOQ3 s = new SOQ3();

   }

   public SOQ3()
   {

      initialize();

   }

   private void initialize()
   {
      mainWindowFrame = new JFrame();
      mainWindowFrame.setTitle("Lock and Log");
      mainWindowFrame.setIconImage(Toolkit.getDefaultToolkit().getImage(MainWindow.class.getResource("/lockandlog/main/resources/icon.png")));
      mainWindowFrame.setResizable(false);
      mainWindowFrame.setBounds(100, 100, 854, 480);
      mainWindowFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      mainWindowFrame.getContentPane().setLayout(null);

      final JTextArea logDisplay = new JTextArea();
      logDisplay.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 0)));
      logDisplay.setEditable(false);
      logDisplay.setBounds(259, 11, 579, 250);
      mainWindowFrame.getContentPane().add(logDisplay);

      JLabel viewCmdDisplayLbl = new JLabel("View Command Display:");
      viewCmdDisplayLbl.setFont(new Font("Tahoma", Font.BOLD, 11));
      viewCmdDisplayLbl.setBounds(259, 272, 133, 14);
      mainWindowFrame.getContentPane().add(viewCmdDisplayLbl);

      JTextArea textArea = new JTextArea();
      textArea.setEditable(false);
      textArea.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 0)));
      textArea.setBounds(259, 297, 579, 104);
      mainWindowFrame.getContentPane().add(textArea);

      JToolBar toolBar = new JToolBar();
      toolBar.setBounds(0, 412, 848, 16);
      mainWindowFrame.getContentPane().add(toolBar);

      JPanel manualGrp = new JPanel();
      manualGrp.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null));
      manualGrp.setBounds(10, 11, 239, 72);
      mainWindowFrame.getContentPane().add(manualGrp);
      manualGrp.setLayout(null);

      manualTxt = new JTextField();
      manualTxt.setBounds(10, 7, 219, 20);
      manualGrp.add(manualTxt);
      manualTxt.setColumns(10);

      JButton manualBtn = new JButton("Manual Override");
      manualBtn.setFont(new Font("Tahoma", Font.BOLD, 12));
      manualBtn.setBounds(10, 38, 219, 23);
      manualGrp.add(manualBtn);

      JMenuBar menuBar = new JMenuBar();
      mainWindowFrame.setJMenuBar(menuBar);

      final JMenu fileBtn = new JMenu("File");
      fileBtn.addMouseListener(
            new MouseAdapter() //This works
            {
               @Override
               public void mouseEntered(MouseEvent e)
               {
                  fileBtn.setSelected(true);
               }
               @Override
               public void mouseExited(MouseEvent e)
               {
                  fileBtn.setSelected(false);
               }
            });
      menuBar.add(fileBtn);

      JMenuItem exitBtn = new JMenuItem("Exit");
      //Code is definitely passing through here.
      exitBtn.addActionListener(
            new ActionListener() //This doesn't work?
            {
               @Override
               public void actionPerformed(ActionEvent e)
               {
                  logDisplay.setText("Test"); //This isn't even being called!
                  System.exit(0);
               }
            });
      //Definitely adds the button so code is passing through here.
      fileBtn.add(exitBtn);
   }

}

现在至于这背后的原因,您正在尝试使用 MouseListeners,虽然 MouseListeners 很好,但您需要获取您正在收听的内容的来源。现在,只需添加一个监听器就可以执行与 ActionListener 相同的操作,这也是我选择使用监听器的部分原因。另外,给你一个提示,使用 ActionListeners 监听它所附加的对象完成的操作,MouseListeners 监听你的 Action 以及它所做的一切,无论它是否与你的程序有任何关系。将来,在使用监听器时,请确保它们只监听程序绝对必需的内容。如果您不需要知道鼠标的位置,请不要跟随它。

关于java - 退出按钮不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26205628/

相关文章:

javascript - 用星号或最后两个词替换最后一个词

java - 为什么我会出现无限循环

java - 如何更改 Java 中的标签颜色?

Java 桌面通知 Ubuntu

java - 从另一个按钮更改切换按钮的状态

java - 如何使用 "reduce"将此循环转换为函数表达式?

java - 排序多个 ArrayLists 建议?

java - 从文件中读取数据并将数据放入 JTable

java - 在 swt/jface 应用程序中使用的属性编辑器 Ui

java - 移动到附近的网格点