[英]Exit Button Doesn't Work
深入了解GUI并尝试使事情变得简单。 但是,我似乎只能使用一个简单的“退出”按钮。 我正在使用WindowsEclipse的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中运行类似的其他事件,效果很好。 那我在做什么错?
不要使用mouseListeners,请使用ActionListeners。
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侦听由它附加到的对象完成的Action,MouseListeners侦听您以及它所做的所有事情,无论它是否与程序有关。 将来,在使用侦听器时,请确保它们仅侦听程序绝对必需的内容。 如果您不需要知道鼠标的位置,请不要跟随它。
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
通常,这是捕获退出事件的方式。
对于您的自定义退出按钮,请使用普通的'ol ActionListener
代替MouseListener
,
然后将捕获按钮上的任何事件,并优雅退出代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.