Java 即使windows未聚焦,也要使JTextField接收输入
我正在做一个小的个人项目。Java 即使windows未聚焦,也要使JTextField接收输入,java,swing,jtextfield,Java,Swing,Jtextfield,我正在做一个小的个人项目。 我有两个JFrame窗口,Viewer和Console Viewer只包含JPanel的子类,它应该响应鼠标输入(主要是单击) 控制台包含一个按钮、一个JTextField(输入)和一个JTextArea(输出) 我需要确保当我按下键盘上的键时,控制台JTextField中会出现相应的文本,不仅当焦点由JTextField持有时,而且当焦点由我的应用程序中的任何其他组件持有时 换句话说,我希望JTextField即使在单击Viewer框架之后也能接受输入 这是否可
我有两个
JFrame
窗口,Viewer
和Console
只包含Viewer
的子类,它应该响应鼠标输入(主要是单击)JPanel
控制台包含一个按钮、一个
(输入)和一个JTextField
(输出)JTextArea
JTextField
中会出现相应的文本,不仅当焦点由JTextField
持有时,而且当焦点由我的应用程序中的任何其他组件持有时
换句话说,我希望JTextField
即使在单击Viewer
框架之后也能接受输入
这是否可行
如果这很重要,我运行的是win 8 x64,我并不真正关心可移植性(我是唯一一个会查看或使用此代码的人)
编辑:以下是我的代码示例:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class main {
public static Viewer v;
public static Console c;
public static void main(String[] args) {
v=new Viewer();
c=new Console();
}
static class Viewer extends JFrame {
public Viewer(){
setSize(600,600);
getContentPane().add(new myPanel());
addMouseListener(new mouse());
setVisible(true);
}
}
static class myPanel extends JPanel{
public void paintComponent(Graphics g){
g.setColor(new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255)));
g.fillRect(0, 0, 600, 600);
}
}
static class Console extends JFrame {
public Console(){
setSize(600,200);
JTextField text=new JTextField();
getContentPane().add(text);
setVisible(true);
}
}
static class mouse implements MouseListener{
@Override
public void mouseClicked(MouseEvent arg0) {
v.repaint();
}
@Override
public void mouseEntered(MouseEvent arg0) {
}
@Override
public void mouseExited(MouseEvent arg0) {
}
@Override
public void mousePressed(MouseEvent arg0) {
}
@Override
public void mouseReleased(MouseEvent arg0) {
}
}
}
在这个例子中,当我点击大窗口改变它的颜色后,如果我想在另一个窗口中写东西,我必须先点击它 我能推荐一下吗?我发现这是实现我相信你正在努力实现的目标的最简单的方法
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
new KeyEventDispatcher() {
public void dispatchKeyEvent(KeyEvent ke) {
//TODO: fill this in
}
});
一个不雅观的解决方案是创建一个
KeyListener
,它将键入的字符提供给您的控制台,尽管具体的实现方式取决于您如何创建组件。在本例中,我将假装通过控制台
类中的静态方法执行此操作(最好您可以访问控制台
的实例):
然后在控制台中
,确保您的JTextField
对象是全局和静态的,然后设置feedChar()
方法
public class Console extends JFrame {
private static JTextField consoleTextField;
public Console() {
consoleTextField = new JTextField();
// ...
}
public static feedChar(char c) {
consoleTextField.setText(consoleTextField.getText() + c.toString());
}
}
最后,您必须将此侦听器添加到所有JFrames及其子对象中
public class Viewer extends JFrame {
public Viewer() {
ApplicationKeyListener kl = new ApplicationKeyListener();
addKeyListener(kl);
for (Component child : this.getComponents()) {
child.addKeyListener(kl);
}
}
}
你能展示你的代码吗?“我有两个JFrame…”这就是GUI开始出错的地方。请看,请不要发布所有代码。相反,发布一个简短的、可运行的示例,重现您的问题。请参阅或。这不起作用,我将无法使用退格键、箭头键等。您可以始终添加到侦听器中,并检查keycode 8、37和39等,然后通过
JTextField.setCaretPosition(int)
,setText()
等单独处理它们。当然,如果ControlAltDel的答案有效的话,它的复杂度将降低一百万倍。这听起来是一个很有希望的方法,但我不知道如何将事件发送到JTextField。仅仅调用text.dispatchEvent(e)就会抛出一堆红色文本。有什么建议吗?没关系,我明白了,我只需要调用redispatchEvent方法(duh)。现在它就像一个符咒,谢谢:)
public class Viewer extends JFrame {
public Viewer() {
ApplicationKeyListener kl = new ApplicationKeyListener();
addKeyListener(kl);
for (Component child : this.getComponents()) {
child.addKeyListener(kl);
}
}
}