Java 单击背景jFrame后,JPOppMenu未隐藏
我使用的是一个Java 单击背景jFrame后,JPOppMenu未隐藏,java,swing,jcheckbox,jpopupmenu,Java,Swing,Jcheckbox,Jpopupmenu,我使用的是一个jpopumenu,它包含多个jCheckBoxMenuItem。用户可以选中/取消选中多个复选框。但是当我点击JFrame时,PopupMenu并没有隐藏。 这是完整的代码 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class PopupTest extends JFrame { JButton button1; public PopupTest() { setT
jpopumenu
,它包含多个jCheckBoxMenuItem
。用户可以选中/取消选中多个复选框
。但是当我点击JFrame
时,PopupMenu
并没有隐藏。
这是完整的代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PopupTest extends JFrame {
JButton button1;
public PopupTest() {
setTitle("Popup Test !");
setSize(400, 400);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
button1 = new JButton("Click me!");
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int count = 250; // this count value is dynamic
JPopupMenu menu = new JPopupMenu();
JCheckBoxMenuItem item = null;
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
JScrollPane scrollPane = new JScrollPane(panel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setPreferredSize(new Dimension(125, 200));
for (int i = 1; i <= count; i++) {
item = new JCheckBoxMenuItem("Page : " + i, new ImageIcon("test.png"));
item.setHorizontalTextPosition(JMenuItem.RIGHT);
item.addActionListener(new OpenAction(menu, button1));
panel.add(item);
}
menu.add(scrollPane);
JCheckBoxMenuItem selectAll = new JCheckBoxMenuItem("Select All", new ImageIcon("test.png"));
selectAll.addActionListener(new OpenAction(menu, button1));
menu.insert(selectAll, 0);
if (!menu.isVisible()) {
Point p = button1.getLocationOnScreen();
menu.setLocation((int) p.getX(), (int) p.getY() + button1.getHeight());
menu.setVisible(true);
} else {
menu.setVisible(false);
}
}
});
add(button1);
}
private static class OpenAction implements ActionListener {
private JPopupMenu menu;
private JButton button;
private OpenAction(JPopupMenu menu, JButton button) {
this.menu = menu;
this.button = button;
}
@Override
public void actionPerformed(ActionEvent e) {
String chkBoxText = e.getActionCommand().toString();
AbstractButton aButton = (AbstractButton) e.getSource();
boolean selected = aButton.getModel().isSelected();
Icon checkedIcon = new ImageIcon("test1.png");
Icon uncheckedIcon = new ImageIcon("test.png");
JScrollPane pane = null;
JViewport viewport = null;
JPanel panel = null;
JCheckBoxMenuItem item = null;
pane = (JScrollPane) menu.getComponent(1); //0th component is "Select All" check box
viewport = pane.getViewport();
panel = (JPanel) viewport.getComponent(0);
int totalChkBoxComponent = panel.getComponentCount();
if (selected) {
System.out.println(chkBoxText + " is Checked!");
if (chkBoxText.trim().equalsIgnoreCase("select all")) {
for (int i = 0; i < totalChkBoxComponent; i++) {
item = (JCheckBoxMenuItem) panel.getComponent(i);
item.setSelected(selected);
item.setIcon(item.isSelected() ? checkedIcon : uncheckedIcon);
}
}
} else if (!selected) {
System.out.println(chkBoxText + " is Un-Checked!");
if (chkBoxText.trim().equalsIgnoreCase("select all")) {
for (int i = 0; i < totalChkBoxComponent; i++) {
item = (JCheckBoxMenuItem) panel.getComponent(i);
item.setSelected(selected);
item.setIcon(item.isSelected() ? checkedIcon : uncheckedIcon);
}
} else { // this is for, after checking "Select All", if any other is unchecked, then "Select ALL" should be unchecked.
item = (JCheckBoxMenuItem) menu.getComponent(0);
item.setSelected(selected);
item.setIcon(selected ? checkedIcon : uncheckedIcon);
}
}
aButton.setIcon(aButton.isSelected() ? checkedIcon : uncheckedIcon);
}
}
public static void main(String args[]) {
new PopupTest();
}
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类poputest扩展了JFrame{
按钮1;
公共弹出测试(){
setTitle(“弹出测试!”);
设置大小(400400);
setVisible(真);
setDefaultCloseOperation(关闭时退出);
setLayout(新的FlowLayout());
button1=新的JButton(“单击我!”);
button1.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
int count=250;//此计数值是动态的
JPopupMenu=newjpopupmenu();
JCheckBoxMenuItem item=null;
JPanel面板=新的JPanel();
panel.setLayout(新的BoxLayout(panel,BoxLayout.Y_轴));
JScrollPane scrollPane=新的JScrollPane(面板,
JScrollPane.VERTICAL\u滚动条\u始终,
JScrollPane.HORIZONTAL\u SCROLLBAR\u NEVER);
scrollPane.setPreferredSize(新维度(125200));
对于(int i=1;i首先,您的代码并不是执行此操作的最佳方式。您不应该每次单击按钮时都创建一个新菜单,而是创建一次并将其作为字段保留引用
PopupMenu
没有隐藏的原因是您显式调用了setVisible(true);
并尝试在分配给按钮而不是框架的同一个ActionListener
中执行setVisible(false);
你可以:
1.在框架中添加另一个侦听器,以便在单击时将菜单可见性设置为false
2.使用show
方法代替setVisible
:
menu.show(button1, 0, button1.getHeight());
而不是
menu.setLocation((int) p.getX(), (int) p.getY() + button1.getHeight());
menu.setVisible(true);
然而,在我们的例子中,这会导致菜单消失的其他问题。我认为最好的方法是重新设计代码。+1………..nice hackmenu.show不起作用。如果我使用它,则弹出窗口会自动隐藏在鼠标上方。