如何使背景框架的 JtextField 聚焦?



我遇到了一个问题。我设计了一个带有 2 个文本框的简单JFrame。在加载 JFrame 时,我也加载VirtualKeyboard这是一个JDialog形式。现在的问题是框架和键盘都在那里,但在 JFrame 中我无法单击文本字段。如果我关闭键盘,我就可以使用JFrame。打开键盘时如何访问JFrame

JFrame加载时,我将JDialog称为follows_

这是我的JFrame:

public class TestText extends javax.swing.JFrame {
static KeyBoard vk;
/**
 * Creates new form TestText
 */
public TestText() {
    initComponents();
    vk = new KeyBoard(new javax.swing.JFrame(), true);
}
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new TestText().setVisible(true);
             vk.setLocation(30,500);
            vk.setVisible(true);
        }
    });
}
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
}

这是我的VirtualKeybord,它是一个JDialog:

public class KeyBoard extends javax.swing.JDialog {
/**
 * Creates new form KeyBoard
 */
public KeyBoard(java.awt.Frame parent, boolean modal) {
    super(parent, modal);
    setFocusableWindowState(false);
    setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    initComponents();
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    if(evt.getSource()==jButton2)
    {
        try{
            Robot robot = new Robot(); 
            robot.keyPress(KeyEvent.VK_A); 
            }
            catch(Exception E){}
    }
} 
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
     if(evt.getSource()==jButton1)
    {
        try{
            Robot robot = new Robot(); 
            robot.keyPress(KeyEvent.VK_TAB); 
            }
            catch(Exception E){}
    }
}  
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;

我需要更改什么,可以使用文本字段访问键盘和 JFrame?

问题是您将新框架设置为键盘对话框的父级。如果这样做,键盘会阻止 jframe,直到它关闭。有多种方法可以解决这个问题。

1) 您可以将模态设置为 false。这会告诉对话框它不应阻止其父级:

vk = new KeyBoard(new javax.swing.JFrame(), false);

2) 您可以使用 null 作为其父级初始化键盘并单独启动框架:

public TestText() {
    initComponents();
    new javax.swing.JFrame();
    vk = new KeyBoard(null, true);
}

这将创建一个独立于键盘的新框架。

3)另一种方法是,如果你愿意,你的键盘知道之前创建的jframe,你必须将其添加到与父变量不同的变量中,如下所示:

public class KeyBoard extends javax.swing.JDialog {
    /**
     * Creates new form KeyBoard
     */
    public KeyBoard(java.awt.Frame parent, boolean modal) {
        super(null, modal);
        this.frame = parent;
        setFocusableWindowState(false);
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        initComponents();
    }
    //Here are the other methods...
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private java.awt.Frame frame;
}

然后,您还可以创建一个新的解锁键盘,如下所示:

vk = new KeyBoard(new javax.swing.JFrame(), false);

最新更新