2012-09-24 123 views
0

我試圖找到一個忠實的翻譯從c#的void keypressed到java沒有任何成功,但任何人都有吸引力?激活事件與按鍵

我想要當我按下鍵13(輸入),私人無效doen()激活一次。

import java.awt.event.*; 
import javax.swing.JTextField; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.Toolkit; 
import java.util.Timer; 
import java.util.TimerTask; 

public class Paneel extends JPanel { 

    private static final long serialVersionUID = 1L; 
    String text; 
    String AccountName = "default"; 
    String autosavecheck = ""; 
    String iss; 
    JProgressBar monsterbar, progressbar; 
    JButton sendknop, clearknop, creditsknop, saveknop, loadknop, restartknop, 
      disableautosaveknop; 
    JTextArea commandstextbox, dialoogtextbox; 
    JTextField naamtextbox, invoertextbox; 
    JOptionPane resetdialog; 
    Toolkit toolkit; 
    Timer timer; 

    public Paneel() { 

     setLayout(null); 
// -------------------------------- 
     dialoogtextbox = new JTextArea(); 
     dialoogtextbox.setFont(new Font("sansserif", Font.BOLD, 12)); 
     dialoogtextbox.setBounds(12, 12, 838, 207); 
     dialoogtextbox.list(); 

     invoertextbox = new JTextField(12); 
     invoertextbox.setBounds(12, 330, 982, 20); 
     invoertextbox.setEnabled(false); 
     commandstextbox = new JTextArea(); 
     commandstextbox.setBounds(856, 28, 138, 191); 
     naamtextbox = new JTextField(12); 
     naamtextbox.setBounds(772, 263, 220, 20); 

     toolkit = Toolkit.getDefaultToolkit(); 
     timer1 = new Timer(); 
     toolkit = Toolkit.getDefaultToolkit(); 
     autosave = new Timer(); 
     toolkit = Toolkit.getDefaultToolkit(); 
     monstertimer = new Timer(); 
     toolkit = Toolkit.getDefaultToolkit(); 
     autodisabletimer = new Timer(); 

     sendknop = new JButton("Send"); 
     sendknop.setBounds(12, 260, 75, 23); 
     sendknop.addActionListener(new sendknopHandler()); 

     add(sendknop); 
    } 

    private void keypressed() { 
     if (e.KeyChar == (char) Keys.Return) { 
      doen(); 
     } 
    } 

    private void doen() { 
     text = invoertextbox.getText(); 
     invoertextbox.setText(""); 
    } 
} 
+2

無關,只是爲了強調良好的生活習慣:**不**做手工上漿/定位** **過,改用適合自己需要一個LayoutManager – kleopatra

回答

1

首先:讓你的格式正確,請參閱插入代碼片段的說明。幫助我們這些誰讀它:)

我不完全確定你在這裏問什麼,但我想你試圖讓你的程序響應用戶點擊任何按鈕。這發生在您應該擁有的各種按鈕的ActionListeners中。例如,在你的情況下,sendknopHandler應該包含邏輯來處理當用戶按下這個特定按鈕時發生的事情。在這個課堂內部,你必須過濾掉動作的來源(即按下按鈕),動作是什麼,以及你想如何迴應。

1

瞭解所有的聽衆和更具體的key listeners

+2

我寧願建議[鍵綁定]( http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) –

+1

我總是說跑步前先開始走路,但KeyBindings確實是一個不錯的選擇 – Peter

1

是「鍵13」的按鈕或者是當用戶輸入「13」?

如果它是一個按鈕,只要使用

button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
          your statements; 
        } 
} 

以其它方式使用的鍵偵聽彼得迴應。之後的代碼行add(sendknop);

+1

這是事件擊中的ebter'KeyEvent.VK_ENTER' – MadProgrammer

1

一)public Paneel() {失蹤},同樣的問題是public class Paneel extends JPanel {

B)從這個代碼,並以這種形式,你永遠也不會聽任何事件,因爲代碼是不可運行,你的問題是關於Java基礎,而不是左右搖擺GUI,也沒有關於監聽

C)聽ENTER關鍵你要添加ActionListenerJButton

d)爲Swing GUI必須使用Swing Timer代替util.Timer,否則你有Concurency in Swing

E對於Swing GUI的問題)不使用的KeyListener,有KeyBindings,並輸出到Swing Action

f)在其他Swing JComponents有有Focus in the WindowKeyListener

0

通過添加下面的幾行代碼的初始化部分添加一鍵收聽到您的invoertextbox

Paneel類中

import java.awt.event.KeyListener; 

public class Paneel extends JPanel implements KeyListener { 

和實現接口的以下方法:

然後擴展您的類實現KeyListener接口加入

@Override 
public void keyTyped(KeyEvent e) { 
} 

@Override 
public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode()==KeyEvent.VK_ENTER) { 
    doen(); 
    } 
} 

@Override 
public void keyReleased(KeyEvent e) { 
} 

private void doen() { 
    text = invoertextbox.getText(); 
    invoertextbox.setText(""); 
} 

考慮使用的keyTyped(KeyEvent)代替keyPressed(KeyEvent)

「按鍵類型」事件是較高級別的事件,通常不依賴於平臺或鍵盤佈局 。它們是在輸入Unicode 字符時生成的,並且是查找有關 字符輸入的首選方式。在最簡單的情況下,由單個按鍵產生 鍵入鍵事件(例如,「A」)[...](JavaDoc for KeyEvent

2

那麼如果你要調用的方法一旦JButton按下你倒是有一個ActionListeneractionPerformed(ActionEvent ae)這樣的範圍內添加到JButton並調用方法:

jBtn.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("called"); 
     //call method here 
    } 
    }); 

,或者如果你想打電話,一旦一個鍵被按下的JPanel使用KeyBindings而不是KeyListener方法像這樣:

JPanel panel=...; 
...  

panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), "send"); 
panel.getActionMap().put("send", new MyAction()); 

... 

class MyAction extends AbstractAction { 
@Override 
public void actionPerformed(ActionEvent e) { 
    System.out.println("called"); 
    //call method here 
} 

} 
2

正如你可以,你可以嘗試很多方法。您沒有真正指定您想要監控哪個組件,因此我們向您提出了一些不同的建議......

在以下示例中演示了key bindings和默認按鈕RootPane

不幸的是,在通知根窗格之前,JTextArea消耗了回車鍵,這意味着它不會觸發。這是文本字段在響應輸入鍵操作時的一般問題。

您將面對的另一個問題是,我已經覆蓋了JtextField的輸入鍵的默認行爲,這意味着它不會再插入新行。

public class TestPane extends JPanel { 

    private JTextArea textArea; 
    private JButton doneButton; 

    public TestPane() { 

     textArea = new JTextArea(10, 50); 
     doneButton = new JButton("Done"); 

     setLayout(new GridBagLayout()); 

     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.weightx = 1; 
     gbc.weighty = 1; 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.insets = new Insets(4, 4, 4, 4); 

     add(new JScrollPane(textArea), gbc); 

     gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 1; 
     gbc.insets = new Insets(4, 4, 4, 4); 

     add(doneButton, gbc); 

     InputMap inputMap = textArea.getInputMap(JComponent.WHEN_FOCUSED); 
     ActionMap actionMap = textArea.getActionMap(); 

     inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "enter"); 
     actionMap.put("enter", new AbstractAction() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 

       System.out.println("I'm done here"); 

      } 
     }); 

     doneButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("All the way out..."); 
      } 
     }); 

    } 

    @Override 
    public void addNotify() { 

     super.addNotify(); 

     // This is the button that will be activate by "default", depending on 
     // what that means for the individual platforms... 
     SwingUtilities.getRootPane(this).setDefaultButton(doneButton); 

    } 

    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 

       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception exp) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setSize(400, 400); 
       frame.setLocationRelativeTo(null); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.setVisible(true); 

      } 
     }); 

    } 

} 
+0

+1總是很棒的例子 –

+1

@DavidKroukamp仍在竊取你的想法;) – MadProgrammer