gpt4 book ai didi

java - 当我在 JTextField 中写入时,JPopupMenu 会自动调整大小

转载 作者:行者123 更新时间:2023-12-01 11:09:38 26 4
gpt4 key购买 nike

我正在尝试构建一个在鼠标输入特定组件时出现的 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);
}
}

最佳答案

对于第一个问题:

解决方案:

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

我认为(!)闪烁效果的原因是因为 JPopupMenu 没有在其类层次结构中扩展 Window (见下文),并且 pack() 方法仅针对 Windows 设计。

 java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JPopupMenu

对于第二个问题:

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

关于java - 当我在 JTextField 中写入时,JPopupMenu 会自动调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32524063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com