JWindow的右键菜单在失去焦点后不能自动消失

susuifeng 2010-08-13 03:00:57
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JWindow;

public class Main {

public Main() {
}

static public class PopupListener extends MouseAdapter {
JPopupMenu menu;

public PopupListener(JPopupMenu menu) {
this.menu = menu;
}

public void mousePressed(MouseEvent e) {
showPopup(e);
}

public void mouseReleased(MouseEvent e) {
showPopup(e);
}

private void showPopup(MouseEvent e) {
if (e.isPopupTrigger()) {

menu.show(e.getComponent(), e.getX(), e.getY());

System.out.println("Showing menu at "
+ menu.getLocationOnScreen() + " isVisible: "
+ menu.isVisible() + " isValid: " + menu.isValid());
}
}
}


public static void main(String[] args) {
JWindow window = new JWindow();
window.setBounds(10, 10, 100, 100);

JPopupMenu popupMenu = new JPopupMenu();
JMenuItem quit = new JMenuItem("Quit");
quit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
popupMenu.add(quit);

window.addMouseListener(new PopupListener(popupMenu));


window.setFocusable(true);

window.validate();
window.setVisible(true);
}

}



上面是例子,运行后会发现,在那个JWindow上点击右键会出现"quit"的弹出菜单,在JWindow上点击左键弹出菜单会消失.....这没有问题.....问题是,将鼠标移到jwindow之外的区域点击,弹出菜单不会消失.............求解决办法.....................
...全文
296 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bayerfly 2010-08-23
  • 打赏
  • 举报
回复
Jwindow能不能做成弹出菜单?
luckli 2010-08-14
  • 打赏
  • 举报
回复
在矩形区域之外点击时肯定没有效果的,
如果不在那个区域点击都有效果的话就乱套了,
两个不同的进程就不知道应该谁去处理这个事件。

如果你开了两个窗口,在这个上点右键,弹出菜单出来,在另一个上点左键,
如果你要求的效果实现的话就会很困惑,程序不知道究竟要相应哪个窗口的命令。

所以,事件监听器只监听在对象区域内发生的事件
gentalguo 2010-08-13
  • 打赏
  • 举报
回复
window之外的区域,你指的是什么?
通常一个JWindow对象不会单独存在,它的用法,你也不要当作一个普通的窗体来用。而且,有些情况下是必须指定其所有者的。

请参考如下代码,你会发现Jwindow我添加了一个JTextField,是否可以编辑,什么时候可编辑,自己体会

package test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import javax.swing.JWindow;

public class Main {

public Main() {
}

static public class PopupListener extends MouseAdapter {
JPopupMenu menu;

public PopupListener(JPopupMenu menu) {
this.menu = menu;
}

public void mousePressed(MouseEvent e) {
showPopup(e);
}

public void mouseReleased(MouseEvent e) {
showPopup(e);
}

private void showPopup(MouseEvent e) {
if (e.isPopupTrigger()) {

menu.show(e.getComponent(), e.getX(), e.getY());

System.out.println("Showing menu at "
+ menu.getLocationOnScreen() + " isVisible: "
+ menu.isVisible() + " isValid: " + menu.isValid());
}
}
}

public static void main(String[] args) {
final JFrame f = new JFrame();

JButton btn = new JButton("show window");
f.getContentPane().add(btn, BorderLayout.SOUTH);
f.getContentPane().add(new JTextField());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 这里尝试一下如果换为new JWindow会发生什么
JWindow window = new JWindow();
// window.setBounds(10, 10, 100, 100);
window.getContentPane().add(new JTextField(30),
BorderLayout.NORTH);
window.getContentPane().setBackground(Color.cyan);
window.setSize(300, 100);
window.setLocationRelativeTo(null);

final JPopupMenu popupMenu = new JPopupMenu();
JMenuItem quit = new JMenuItem("Quit");
quit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
popupMenu.add(quit);

window.addMouseListener(new PopupListener(popupMenu));
window.addWindowFocusListener(new WindowAdapter() {
@Override
public void windowGainedFocus(WindowEvent e) {
// TODO Auto-generated method stub
super.windowGainedFocus(e);
System.out.println("gain");
}

@Override
public void windowLostFocus(WindowEvent e) {
// TODO Auto-generated method stub
super.windowLostFocus(e);
System.out.println("lose");
}
});

window.setFocusable(true);

window.validate();
window.setVisible(true);

}
});
f.setSize(800, 600);
f.setLocationRelativeTo(null);
f.setVisible(true);

}

}


susuifeng 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 huntor 的回复:]
运行了一下lz的代码,没遇到lz说的情况。
ubuntu 8.04 + java 6u21
[/Quote]

我的是win7, 用java -fullversion 查看到的是 1.6.0_21-b06........可能是因为你的是linux?
susuifeng 2010-08-13
  • 打赏
  • 举报
回复


如图,在箭头处使劲点击鼠标,那个菜单总也不能消失.....................

huntor 2010-08-13
  • 打赏
  • 举报
回复
运行了一下lz的代码,没遇到lz说的情况。
ubuntu 8.04 + java 6u21
susuifeng 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gentalguo 的回复:]
JWindow window = new JWindow(f);

[/Quote]

我是在一个用JWindow实现悬浮窗的例子里遇到这种菜单不能自动消失的情况的, 主类继承了JWindow,似乎没有父窗体...........我再试试加个JFrame作为JWindow的父窗体...................................
luckli 2010-08-13
  • 打赏
  • 举报
回复
在矩形区域之外点击时肯定没有效果的,
如果不在那个区域点击都有效果的话就乱套了,
两个不同的进程就不知道应该谁去处理这个事件。

如果你开了两个窗口,在这个上点右键,弹出菜单出来,在另一个上点左键,
如果你要求的效果实现的话就会很困惑,程序不知道究竟要相应哪个窗口的命令。

所以,事件监听器只监听在对象区域内发生的事件。
gentalguo 2010-08-13
  • 打赏
  • 举报
回复
呵呵,抱歉,是我疏忽了。请看一下
JWindow window = new JWindow();

JWindow window = new JWindow(f);
的差别。
susuifeng 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gentalguo 的回复:]
window之外的区域,你指的是什么?
通常一个JWindow对象不会单独存在,它的用法,你也不要当作一个普通的窗体来用。而且,有些情况下是必须指定其所有者的。

请参考如下代码,你会发现Jwindow我添加了一个JTextField,是否可以编辑,什么时候可编辑,自己体会

Java code

package test;

import java.awt.BorderLayo……
[/Quote]



那个jwindow不是一个矩形么? window之外的区域就是指 那个矩形之外的区域..........


另外,我点击了好多下都没见输出"gain"和"lose"................

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧