JPopupMenu 将初始焦点给予子项 (JTextField),即使超出父框架的边界(重量级)
JPopupMenu give initial focus to a child (JTextField), even when exceeding parent frame's boundaries (heavy-weight)
我有这种情况,当弹出菜单超出父框架的边界时,尽管调用 requestFocus
,JPopupMenu
中的 JTextField
仍未获得焦点。这是在 Linux/Gtk 上具有不同的外观和感觉(例如金属)(不确定是否与平台有关)。示例:
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class FocusTest implements Runnable {
public static void main(String[] args) {
EventQueue.invokeLater(new FocusTest());
}
public void run() {
final JFrame f = new JFrame();
final JButton invoker = new JButton("Pop");
final JPopupMenu pop = new JPopupMenu();
final JTextField text = new JTextField(12);
pop.add(text);
pop.pack();
invoker.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pop.show(invoker, 0, 0);
System.out.println("here");
text.requestFocus();
}
});
f.getContentPane().add(invoker);
f.pack();
f.setVisible(true);
}
}
使用默认的frame size,popup比frame大,不给焦点:
当 window 变大时,打开弹出窗口 提供 初始焦点,我可以在没有鼠标交互的情况下开始在文本字段中键入:
这似乎与第一种情况下popup做的很重,第二种情况下popup做的很轻有关。例如,如果我添加 pop.setLightWeightPopupEnabled(false);
,那么即使弹出窗口包含在父框架内,也不会给出焦点。
如何确保在任何情况下都给予重点(也适用于重量级同行)?
所以明确地使用未修饰的对话框似乎可行:
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JTextField;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class FocusTest implements Runnable {
public static void main(String[] args) {
EventQueue.invokeLater(new FocusTest());
}
public void run() {
final JFrame f = new JFrame();
final JButton invoker = new JButton("Pop");
final JDialog pop = new JDialog();
pop.setUndecorated(true);
final JTextField text = new JTextField(12);
pop.add(text);
pop.pack();
invoker.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pop.setLocationRelativeTo(invoker);
pop.setVisible(true);
}
});
f.getContentPane().add(invoker);
f.pack();
f.setVisible(true);
}
}
我有这种情况,当弹出菜单超出父框架的边界时,尽管调用 requestFocus
,JPopupMenu
中的 JTextField
仍未获得焦点。这是在 Linux/Gtk 上具有不同的外观和感觉(例如金属)(不确定是否与平台有关)。示例:
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class FocusTest implements Runnable {
public static void main(String[] args) {
EventQueue.invokeLater(new FocusTest());
}
public void run() {
final JFrame f = new JFrame();
final JButton invoker = new JButton("Pop");
final JPopupMenu pop = new JPopupMenu();
final JTextField text = new JTextField(12);
pop.add(text);
pop.pack();
invoker.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pop.show(invoker, 0, 0);
System.out.println("here");
text.requestFocus();
}
});
f.getContentPane().add(invoker);
f.pack();
f.setVisible(true);
}
}
使用默认的frame size,popup比frame大,不给焦点:
当 window 变大时,打开弹出窗口 提供 初始焦点,我可以在没有鼠标交互的情况下开始在文本字段中键入:
这似乎与第一种情况下popup做的很重,第二种情况下popup做的很轻有关。例如,如果我添加 pop.setLightWeightPopupEnabled(false);
,那么即使弹出窗口包含在父框架内,也不会给出焦点。
如何确保在任何情况下都给予重点(也适用于重量级同行)?
所以明确地使用未修饰的对话框似乎可行:
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JTextField;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class FocusTest implements Runnable {
public static void main(String[] args) {
EventQueue.invokeLater(new FocusTest());
}
public void run() {
final JFrame f = new JFrame();
final JButton invoker = new JButton("Pop");
final JDialog pop = new JDialog();
pop.setUndecorated(true);
final JTextField text = new JTextField(12);
pop.add(text);
pop.pack();
invoker.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pop.setLocationRelativeTo(invoker);
pop.setVisible(true);
}
});
f.getContentPane().add(invoker);
f.pack();
f.setVisible(true);
}
}