2014-10-05 4 views
0

GUI를 조금 익히고 간단한 것을 만들려고합니다. 그러나, 나는 단순한 "Exit"버튼을 만드는데 매달려있다. 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에서 시도해 보면 훌륭합니다. 그래서 내가 뭘 잘못하고 있니?

답변

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

} 

지금이 뒤에 이유에 관해서는, 당신이있는 MouseListener 좋은 동안, 당신은 당신이 듣고 무엇의 원인을 GET 할 필요가있는 MouseListener를 사용하고있었습니다. 청취자를 추가하는 것만으로도 ActionListener 인 것처럼 행동 할 수 있습니다. 이유 중 하나를 선택하여 사용했기 때문입니다. 또한, 당신을위한 팁, ActionListeners를 사용하여 그것에 연결된 객체에 의해 수행 된 Action을 듣고, MouseListeners는 당신의 모든 것을 듣습니다. 앞으로 청취자를 사용할 때 프로그램에 절대적으로 필요한 것을 청취하도록하십시오. 마우스 위치를 알 필요가 없으면 마우스를 따라 가지 마십시오.

+1

이유가 무엇입니까? 'ActionListener'에 대해서는 –

+1

+1입니다. 또한 더 나은 정보와 작동 예제를 위해 [Menus 사용 방법] (http://docs.oracle.com/javase/tutorial/uiswing/components/menu.html)의 스윙 튜토리얼을 읽는 것이 좋습니다. 코드를 구조화하십시오. 예를 들어 레이아웃 관리자 (setBounds()가 아님)를 사용해야하며 이벤트 발송 스레드에서 GUI를 만들어야합니다. – camickr

+1

@KickButtowski 좋은 지적, 나는 나의 대답을 편집 할 것이다. – DreadHeadedDeveloper

0
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

일반적으로 이탈 이벤트를 캡처하는 방법입니다. 대신 MouseListener의 사용자 정의 종료 버튼

은, 그냥 일반 시도 버튼에 어떤 이벤트가 다음 캡처되며, 코드가 정상적으로 종료 ActionListener

을 올 실시.

+0

그러면 프로그램을 닫으면 어떻게 될까요? 또한 프로그램을 종료 할 수있는 것이 아닙니다. 이벤트 내에서 다른 작업을 실행할 수도 없습니다! 아무것도 이벤트를 지나가고 있지 않습니다. – danthonywalker

+0

@ danthonywalker : 특별히 'ActionListener'를 사용하십시오. –

+0

아, 나는 당신이 의미하는 것을 얻지 않는다. 감사! JMenuItems가 마우스 이벤트를 받아들이지 않습니까? – danthonywalker

관련 문제