即使窗口没有聚焦,也可以使JTextField接收输入

时间:2015-08-03 17:39:01

标签: java swing jtextfield

我正在做一个小型的个人项目。

我有两个JFrame个窗口,ViewerConsole

  • Viewer只包含JPanel的子类,它应该响应鼠标输入(主要是点击)。
  • Console包含一个按钮,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) {
        }
    }

}

在这个例子中,点击大窗口改变颜色后,如果我想在另一个窗口中写东西,我必须先点击它。

2 个答案:

答案 0 :(得分:1)

我可以建议KeyboardFocusManager吗?我发现这是实现我认为你想要实现的目标的最简单方法

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
  new KeyEventDispatcher() {
     public void dispatchKeyEvent(KeyEvent ke) {
       //TODO: fill this in
     }
  });

答案 1 :(得分:0)

一个不优雅的解决方案是创建一个KeyListener,它将键入的字符输入到您的控制台,但这究竟是如何发生取决于您创建组件的方式。为了这个例子,我将假装通过Console类中的静态方法来执行此操作(最好您可以访问Console的实例):

public class ApplicationKeyListener implements KeyListener {
    public ApplicationKeyListener() {
    }

    // Other necessary methods...

    public void keyPressed(KeyEvent e) {
        char pressed = e.getKeyChar();
        Console.feedChar(pressed);
    }
}

然后在Console中,确保您的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());
    }
}

然后最后你必须将这个监听器添加到所有JFrame及其子级。

public class Viewer extends JFrame {
    public Viewer() {
        ApplicationKeyListener kl = new ApplicationKeyListener();
        addKeyListener(kl);
        for (Component child : this.getComponents()) {
            child.addKeyListener(kl);
        }
    }
}