当我在 JTextField 里面写的时候自动调整大小的 JPopupMenu
JPopupMenu that automatically resizes as I write in the JTextField inside
我正在尝试构建一个 JPopupMenu
出现在鼠标进入特定组件时。此 JPopupMenu
包含一个 JTextField
用于值编辑(数字)。由于我无法提前知道将要编辑的数字的长度,因此我想在键入每个键后调整弹出窗口的大小。我通过将 KeyListener 添加到 JTextField
并尝试处理焦点来实现这一点。我的技巧奏效了,但是我在构建应用程序时遇到了以下问题:
- 每次我调用
pack()
方法时,焦点都会从 JtextField
移动到另一个组件,然后由于 requestFocus()
方法(这个使我的 windows 不断闪烁)。在这种情况下,让其他组件不可聚焦对我来说不是解决方案。
JPopupMenu
大小消失后退出window.
我在下面附上我的代码摘要。
有没有更好的方法来实现我的目标?或者管理因同时使用 pack()
和 requestFocus()
方法引起的问题?
package prova;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRootPane;
import javax.swing.JTextField;
public class Main {
public final static void main(String[] args ){
JFrame frame = new JFrame();
JPanel p = (JPanel)frame.getContentPane();
p.setLayout(new BorderLayout());
p.setPreferredSize(new java.awt.Dimension(100,100));
JLabel l = new JLabel("my label");
l.setOpaque(true);
l.setPreferredSize(new java.awt.Dimension(50,20));
l.setBackground(Color.white);
JPopupMenu pop = new JPopupMenu();
JTextField textField = new JTextField("edit text");
textField.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {
pop.pack();
((JTextField)e.getSource()).requestFocus();
}
@Override
public void keyPressed(KeyEvent e) {}
});
l.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {
if(!pop.isVisible()){
pop.show((java.awt.Component)e.getSource(), e.getX(), e.getY());
}
}
@Override
public void mouseClicked(MouseEvent e) {}
});
pop.add(textField);
p.add(l,BorderLayout.EAST);
frame.pack();
frame.setVisible(true);
}
}
第一个问题:
解决方案:
@Override
public void keyReleased(KeyEvent e) {
Window window = SwingUtilities.getWindowAncestor(pop);
window.pack();
}
我认为(!)闪烁效果的原因是因为 JPopupMenu
没有在它的 class 层次结构中扩展 Window
(见下文),并且 pack()
方法仅适用于 windows。
java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JPopupMenu
对于第二题:
我不明白你的意思,当它的大小是 "too big" 时,弹出菜单对我来说不会消失(如果你是这个意思的话)。
我正在尝试构建一个 JPopupMenu
出现在鼠标进入特定组件时。此 JPopupMenu
包含一个 JTextField
用于值编辑(数字)。由于我无法提前知道将要编辑的数字的长度,因此我想在键入每个键后调整弹出窗口的大小。我通过将 KeyListener 添加到 JTextField
并尝试处理焦点来实现这一点。我的技巧奏效了,但是我在构建应用程序时遇到了以下问题:
- 每次我调用
pack()
方法时,焦点都会从JtextField
移动到另一个组件,然后由于requestFocus()
方法(这个使我的 windows 不断闪烁)。在这种情况下,让其他组件不可聚焦对我来说不是解决方案。 JPopupMenu
大小消失后退出window.
我在下面附上我的代码摘要。
有没有更好的方法来实现我的目标?或者管理因同时使用 pack()
和 requestFocus()
方法引起的问题?
package prova;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRootPane;
import javax.swing.JTextField;
public class Main {
public final static void main(String[] args ){
JFrame frame = new JFrame();
JPanel p = (JPanel)frame.getContentPane();
p.setLayout(new BorderLayout());
p.setPreferredSize(new java.awt.Dimension(100,100));
JLabel l = new JLabel("my label");
l.setOpaque(true);
l.setPreferredSize(new java.awt.Dimension(50,20));
l.setBackground(Color.white);
JPopupMenu pop = new JPopupMenu();
JTextField textField = new JTextField("edit text");
textField.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {
pop.pack();
((JTextField)e.getSource()).requestFocus();
}
@Override
public void keyPressed(KeyEvent e) {}
});
l.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {
if(!pop.isVisible()){
pop.show((java.awt.Component)e.getSource(), e.getX(), e.getY());
}
}
@Override
public void mouseClicked(MouseEvent e) {}
});
pop.add(textField);
p.add(l,BorderLayout.EAST);
frame.pack();
frame.setVisible(true);
}
}
第一个问题:
解决方案:
@Override
public void keyReleased(KeyEvent e) {
Window window = SwingUtilities.getWindowAncestor(pop);
window.pack();
}
我认为(!)闪烁效果的原因是因为 JPopupMenu
没有在它的 class 层次结构中扩展 Window
(见下文),并且 pack()
方法仅适用于 windows。
java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JPopupMenu
对于第二题:
我不明白你的意思,当它的大小是 "too big" 时,弹出菜单对我来说不会消失(如果你是这个意思的话)。