2012-03-08 39 views
16

Tôi có một JFrame với ba JButton trên đó. Tôi đã đặt txtSearch (thành phần JTextField) để lấy tiêu điểm khi tải JFrame. Một trong các nút được đặt làm nút mặc định. Đây là mã của tôi:Nút mặc định trong JFrame không kích hoạt khi phím enter đang được nhấn

private void formWindowOpened(java.awt.event.WindowEvent evt) 
{ 
    // btnRefresh.setMnemonic(KeyEvent.VK_R); // Even if this line 
               // is not commented, but 
               // still the event wouldn't fire. 
    this.getRootPane().setDefaultButton(btnRefresh); 
} 

Khi nó tải, nút được chỉ được lựa chọn, nhưng nó đã không làm gì khi Nhập chủ chốt đã được nhấn. Làm cách nào để triển khai chính xác?

btnRefresh.addActionListener(new java.awt.event.ActionListener() { 
    public void actionPerformed(java.awt.event.ActionEvent evt) { 
     btnRefreshActionPerformed(evt); 
    } 
}); 

private void btnRefreshActionPerformed(java.awt.event.ActionEvent evt) {           
    JOptionPane.showMessageDialog(this, "Pressed!"); 
    // Other codes here (Replace by JOptionPane) 
} 
+0

Tôi thấy rằng cách dễ nhất là gọi requestFocusInWindow() SAU JFrame hiển thị để đặt nút mặc định. Hy vọng điều này sẽ giúp một ai đó. – GeriBoss

Trả lời

10

Thành phần nào tập trung khi JFrame xuất hiện? Tôi hỏi vì một số thành phần "ăn" sự kiện phím Enter. Ví dụ: JEditorPane sẽ làm điều đó.

Ngoài ra, khi bạn chỉ định ActionListener đến JTextField, ActionListener sẽ được gọi thay vì DefaultButton cho ngăn gốc. Bạn phải chọn để có một số ActionListener hoặc DefaultButton, nhưng bạn không thể có cả hai lửa cho cùng một JTextField. Tôi chắc rằng điều này cũng áp dụng cho các thành phần khác.

+0

Tôi đã đặt 'JTextField' thành tiêu điểm khi' JFrame' tải. –

+1

phân tích chính xác, không phải là giải pháp :-) @johntotetwoo từ việc chấp nhận điều này, tôi cho rằng nó chỉ vào hướng giải pháp - bạn có thể xem xét chỉnh sửa câu hỏi của mình bằng giải pháp đó – kleopatra

+0

Brilliant .. Tôi có một actionListener trên trường mật khẩu của mình và đã thất bại trong việc tìm ra rằng đó là nguyên nhân của defaultbutton không đáp ứng. Thanx – Olu

0

Tôi không thấy những gì bạn đang làm không chính xác từ những gì được đăng. Đây là một ví dụ ngắn hoạt động. Có lẽ nó sẽ tiết lộ một cái gì đó hữu ích cho bạn.

import java.awt.BorderLayout; 
public class ExampleFrame extends JFrame 
{ 
    private JPanel m_contentPane; 
    private JTextField m_textField; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) 
    { 
    EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      try 
      { 
       ExampleFrame frame = new ExampleFrame(); 
       frame.setVisible(true); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public ExampleFrame() 
    { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 450, 300); 
    m_contentPane = new JPanel(); 
    m_contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    m_contentPane.setLayout(new BorderLayout(0, 0)); 
    setContentPane(m_contentPane); 

    m_textField = new JTextField(); 
    m_contentPane.add(m_textField, BorderLayout.NORTH); 
    m_textField.setColumns(10); 

    JButton btnNewButton = new JButton("Default"); 
    btnNewButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      JOptionPane.showMessageDialog(ExampleFrame.this, "Default."); 
     } 
    }); 
    m_contentPane.add(btnNewButton, BorderLayout.CENTER); 

    JButton btnNewButton_1 = new JButton("Not default"); 
    btnNewButton_1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      JOptionPane.showMessageDialog(ExampleFrame.this, "Not default."); 
     } 
    }); 
    m_contentPane.add(btnNewButton_1, BorderLayout.WEST); 
    m_textField.requestFocus(); 
    getRootPane().setDefaultButton(btnNewButton); 
    } 
} 
+1

thêm một actionListener vào textField và xem điều gì xảy ra :-) – kleopatra

+0

Bạn đóng đinh nó kleopatra! Khi tôi đặt vào ActionListener, nút mặc định sẽ không thành công. johntotetwoo, bạn cần phải * loại bỏ * người nghe hành động để có nút lửa mặc định. –

Các vấn đề liên quan