내 코드 또는 Java 1.7에 문제가 있는지 확실하지 않습니다.사용자 정의 Popup을 사용하여 Java 1.7의 JMenuItem ActionListener에 마우스를 놓친 경우
아래의 코드 (주로 Java Popup Demo에 기반 함)에서 마우스 오른쪽 버튼을 클릭하면 팝업이 나타납니다. 팝업 메뉴 항목은 마우스를 올리면 강조 표시되고 JmenuItem을 클릭하면 팝업이 사라집니다. 그러나 JMenuItem의 actionEvent는 클릭 할 때 발생하지 않습니다 (JTextArea에보고되어야 함).
기타 흙 받이 : JMenuItem (여기에서 "a")에 대한 니모닉을 입력하면 actionEvent가 실행됩니다 (이벤트는 JTextArea에보고됩니다).
사용자 지정 팝업 (팩토리)을 연결하지 않으면 마우스 클릭으로 actionEvent가 예상대로 발생합니다.
java version "1.6.0_33" Java(TM) SE Runtime Environment (build 1.6.0_33-b03-424-11M3720) Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03-424, mixed mode)
이 어떤 도움/생각이 크게 감사합니다 :이 코드와 잘 동작
java version "1.7.0_07" Java(TM) SE Runtime Environment (build 1.7.0_07-b10) Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)
: 나는이 문제가 발생 OSX 10.7.5
사용하고
! 자체 포함 된 코드 예제는 다음과 같습니다.
감사
앤드류는
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PopupMenuDemo implements ActionListener {
JTextArea output;
JScrollPane scrollPane;
String newline = "\n";
public Container createContentPane() {
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setOpaque(true);
output = new JTextArea(5, 30);
output.setEditable(false);
scrollPane = new JScrollPane(output);
contentPane.add(scrollPane, BorderLayout.CENTER);
return contentPane;
}
public void createPopupMenu() {
JMenuItem menuItem;
JPopupMenu popup = new JPopupMenu();
menuItem = new JMenuItem("A popup menu item", 'a');
menuItem.addActionListener(this);
popup.add(menuItem);
MouseListener popupListener = new PopupListener(popup);
output.addMouseListener(popupListener);
}
public void actionPerformed(ActionEvent e) {
JMenuItem source = (JMenuItem)(e.getSource());
String s = "Action event detected."
+ newline
+ " Event source: " + source.getText()
+ " (an instance of " + source.getClass().getName() + ")";
output.append(s + newline);
output.setCaretPosition(output.getDocument().getLength());
}
private void createAndShowGUI() {
JFrame frame = new JFrame("PopupMenuDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
PopupFactory.setSharedInstance(new MyPopupFactory());
PopupMenuDemo demo = new PopupMenuDemo();
frame.setContentPane(demo.createContentPane());
demo.createPopupMenu();
frame.setSize(450, 260);
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new PopupMenuDemo().createAndShowGUI();
}
});
}
class PopupListener extends MouseAdapter {
JPopupMenu popup;
PopupListener(JPopupMenu popupMenu) {
popup = popupMenu;
}
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
}
class MyPopupFactory extends PopupFactory {
public Popup getPopup(Component owner, Component contents, int x, int y) throws IllegalArgumentException {
return new MyPopup(owner, contents, x, y);
}
}
class MyPopup extends Popup {
private JWindow popupWindow;
MyPopup(Component owner, Component contents, int ownerX, int ownerY) {
popupWindow = new JWindow();
popupWindow.setLocation(ownerX, ownerY);
popupWindow.getContentPane().add(contents, BorderLayout.CENTER);
contents.invalidate();
}
public void show() {
popupWindow.setVisible(true);
popupWindow.pack();
}
public void hide() {
popupWindow.setVisible(false);
popupWindow.removeAll();
popupWindow.dispose();
}
}
}
반투명 팝업을 얻기위한 것이라면 [최근 QA] (http : // stackoverflow .com/q/12801035/203657)는 한 번 볼만한 가치가 있습니다. – kleopatra