有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使JTextField接收输入,即使windows未聚焦

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

我有两个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) 个答案

  1. # 1 楼答案

    我能推荐KeyboardFocusManager吗?我发现这是实现我相信你正在努力实现的目标的最简单的方法

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

    一个不雅观的解决方案是创建一个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());
        }
    }
    

    最后,您必须将此侦听器添加到所有JFrames及其子对象中

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