gpt4 book ai didi

java - 如果底层窗口在 ESC 上关闭,如何为 JPopupMenu 启用 ESC 关闭?

转载 作者:行者123 更新时间:2023-11-30 07:36:11 27 4
gpt4 key购买 nike

想象两种常见情况的结合:一个 JDialog(或 JFrame)在 VK_ESCAPE(设置为根 Pane 上的键绑定(bind))上关闭,一个内部 JPopupMenu 也应该在 ESC 上关闭。问题是:如果弹出窗口可见,则按 escape 总是会关闭对话框 - 事件。显然,弹出窗口甚至没有收到按键事件,因此弹出窗口无法使用它。有什么方法可以让它正常工作,以便在第一个 ESC 事件中关闭弹出窗口,在第二个事件中关闭对话框?顺便说一下:它确实与 JComboBox 一起工作,默认情况下,当按下转义键时它会关闭。

最佳答案

找到一个通用的解决方案是一个挑战。我们需要考虑何时:

  1. 使用轻量级弹出
  2. 使用重量级弹出

我确定在这两种情况下,当按下转义键时,根 Pane 实际上都具有焦点。

在第一种情况下,我只搜索根 Pane 以查看是否已将 JPopupMenu 添加到 GUI。如果是这样,那么我们可以关闭弹出窗口。

在第二种情况下,创建了一个包含 JPopupMenu 的窗口,因此我进行了搜索以查看是否显示了可见的自定义弹出窗口。如果是这样,那么我就处理掉这个窗口。

如果以上两种情况都不成立,那么您可以关闭对话框。

import java.awt.*;
import java.awt.event.*;
import java.util.List;
import javax.swing.*;
import javax.swing.event.*;

public class DialogEscape extends JDialog
{
private JPopupMenu popup;

public DialogEscape()
{
popup = new JPopupMenu();
popup.add( new JMenuItem("SubMenuA") );
popup.add( new JMenuItem("SubMenuB") );
popup.add( new JMenuItem("SubMenuC") );
popup.add( new JMenuItem("SubMenuD") );

String[] items = { "Select Item", "Color", "Shape", "Fruit" };
JComboBox comboBox = new JComboBox( items );
add(comboBox, BorderLayout.NORTH);

JTextField textField = new JTextField("Right Click For Popup");
textField.setComponentPopupMenu(popup);
add(textField);

KeyStroke escapeKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false);
Action escapeAction = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
boolean openPopup = false;
Component c = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();

// Check if light weight popup is being used

List<JPopupMenu> popups = SwingUtils.getDescendantsOfType(JPopupMenu.class, (Container)c, true);

for (JPopupMenu p: popups)
{
p.setVisible( false );
openPopup = true;
}

// Check if a heavy weight popup is being used

Window window = SwingUtilities.windowForComponent(c);
Window[] windows = window.getOwnedWindows();

for (Window w: windows)
{
if (w.isVisible()
&& w.getClass().getName().endsWith("HeavyWeightWindow"))
{
openPopup = true;
w.dispose();
}
}

// No popups so close the Window

if (! openPopup)
// SwingUtilities.windowForComponent(c).setVisible(false);
SwingUtilities.windowForComponent(c).dispose();
}
};

getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escapeKeyStroke, "ESCAPE");
getRootPane().getActionMap().put("ESCAPE", escapeAction);
}

public static void main(String[] args)
{
String laf = null;
laf = "javax.swing.plaf.metal.MetalLookAndFeel";
// laf = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
// laf = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";

try { UIManager.setLookAndFeel(laf); }
catch (Exception e2) { System.out.println(e2); }

JDialog dialog = new DialogEscape();
dialog.setDefaultCloseOperation( HIDE_ON_CLOSE );
dialog.setSize(200, 200);
dialog.setLocationRelativeTo(null);
dialog.setVisible( true );
}
}

您还需要下载 Swing Utils类。

关于java - 如果底层窗口在 ESC 上关闭,如何为 JPopupMenu 启用 ESC 关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3811515/

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