2014-10-05 5 views
0

Немного в графических интерфейсах и попытке сделать что-то простое. Тем не менее, я, кажется, застрял, просто делая простую кнопку «Выход». Я использую плагин WindowsBuilder для Eclipse, чтобы помочь мне.Кнопка выхода не работает

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

В данный момент весь класс инициализации. Но если вы заметите, что у меня внизу, у меня есть событие для кнопки «Выход», где, если вы нажмете на нее, программа должна закрыть. Кроме того, когда я нажимаю на кнопку, ничего не происходит. Пробуйте другие события, подобные этому в файлеBtn, который отлично работает. Так что я делаю неправильно?

ответ

3

Не используйте 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, прослушивает действие, выполняемое объектом, к которому он привязан, MouseListeners слушает ваше и все, что он делает, независимо от того, имеет ли он какое-либо отношение к вашей программе. В будущем, при использовании слушателей, убедитесь, что они слушают только то, что абсолютно необходимо для вашей программы. Если вам не нужно знать позицию мыши, не следуйте ей.

+1

в чем причина? –

+1

+1 для 'ActionListener'. Также не забудьте прочитать учебник Swing [Как использовать меню] (http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html) для получения дополнительной информации и рабочих примеров, которые помогут вам лучше структурируйте свой код. Например, вы должны использовать менеджеров компоновки (not setBounds()), и вы должны создать графический интерфейс в потоке отправки событий. – camickr

+1

@KickButtowski Хороший вопрос, я отредактирую свой ответ – DreadHeadedDeveloper

0
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

Как правило, вы можете захватить событие выхода.

Для вашей кнопки пользовательского выхода, вместо MouseListener, попробуйте просто обычный «ол ActionListener

Любое событие на кнопке будет захватываться, и ваш код изящно вышел.

+0

Итак, как бы я мог закрыть программу? Кроме того, это не просто невозможно закрыть программу. Я даже не могу запускать другие операции внутри мероприятия! Ничто не проходит через событие. – danthonywalker

+0

@ danthonywalker: используйте специально «ActionListener». –

+0

Ах, нет, я понимаю, что вы имеете в виду. Благодаря! Неужели JMenuItems не принимает события мыши? – danthonywalker

Смежные вопросы