我遇到了问题。我设计了一个带有2个文本框的简单JFrame
。在加载JFrame时,我还加载了VirtualKeyboard
形式的JDialog
。问题是现在框架和键盘都存在,但在JFrame中我无法单击文本字段。如果我关闭键盘,我可以使用JFrame
。如何在打开键盘时访问JFrame
。
当JFrame
加载时,我正在调用JDialog
,如下所示_
这是我的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?
答案 0 :(得分:1)
问题是您将新帧设置为KeyBoard对话框的父级。 如果这样做,键盘会阻止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);