2012-09-24 121 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