JPopupMenu在我写入JTextField里面时会自动调整大小

时间:2015-09-11 12:56:32

标签: java swing focus jtextfield jpopupmenu

我正在尝试构建鼠标进入特定组件时出现的JPopupMenu。此JPopupMenu包含用于值编辑的JTextField(数字)。由于我无法事先知道将要编辑的数字的长度,因此我想在键入每个键后调整弹出窗口大小。我通过将KeyListener添加到JTextField并尝试处理焦点来实现此目的。我的诀窍有效,但在构建应用程序时遇到以下问题:

  • 每次调用pack()方法时,焦点都会从JtextField移动到另一个组件,然后由于JtextField方法返回requestFocus()(这使得我的窗户不断闪烁)。在这种情况下,为了使其他组件不可聚焦,对我来说不是一个解决方案。
  • JPopupMenu大小时会消失,以便退出窗口。

我在下面附上我的代码摘要。 有没有更好的方法来实现我的目标?或者管理因使用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);
    }
}

1 个答案:

答案 0 :(得分:1)

对于第一个问题:

解决方案:

@Override
public void keyReleased(KeyEvent e) {
    Window window = SwingUtilities.getWindowAncestor(pop);
    window.pack();
}

我认为(!)闪烁效应的原因是因为JPopupMenu并未在其类层次结构中扩展Window(见下文),而{{1} }}方法仅适用于Windows。

pack()

对于第二个问题:

我不明白你的意思,当弹出菜单的大小太大时,弹出菜单就不会消失。" (如果这就是你的意思)。