2

以下に小さなテストケースを用意しました。私の問題は、ウィンドウを右クリックしたときです。JPopupMenuは表示されますが、JWindowメニューの外側をクリックしても消えません。ウィンドウのどこかをクリックして、予期された動作ではないウィンドウを削除する必要があります。

編集:akfの回答を読んだ後、JFrameに切り替えました。フレームにフォーカスがあり、ポップアップメニューが表示されている場合、別のウィンドウをクリックするとフレームが消えます。ただし、ウィンドウにフォーカスがなく、どこかをクリックしてもメニューは消えません。


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

class test {

    static class window extends JWindow
    implements MouseListener, MouseMotionListener{

    JPopupMenu popMenu;
    JPanel panel = new JPanel();

    Point location;
    MouseEvent pressed;

    public window(){

        addMouseListener( this );
        addMouseMotionListener( this );

        JLabel label = new JLabel("JWindow", JLabel.CENTER);

        initPopMenu();
        add(label);
        setVisible(true);
        setAlwaysOnTop(true);
        setLocationRelativeTo(null);
        pack();
    }

    public void initPopMenu(){
        popMenu = new JPopupMenu();
        JMenuItem item;

        item = new JMenuItem( "Title" );
        item.setEnabled(false);
        popMenu.add(item);
        popMenu.addSeparator();

        item = new JMenuItem( "Item One" );
        popMenu.add(item);

        item = new JMenuItem( "Item 2" );
        popMenu.add(item);

        item = new JMenuItem( "Item 3" );
        popMenu.add(item);
    }

    public void mousePressed(MouseEvent e)
    {
        pressed = e;
        int nModifier = e.getModifiers();
        if (((nModifier & InputEvent.BUTTON2_MASK) != 0)||
        ((nModifier & InputEvent.BUTTON3_MASK) != 0))
        popMenu.show( this, e.getX(), e.getY() );
    }

    public void mouseClicked(MouseEvent e) {
    }


    public void mouseReleased(MouseEvent e) {}

    public void mouseDragged(MouseEvent me){
    }

    public void mouseMoved(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    }
    public static void main(String[] args) {
    window dw = new window();
    }
}
4

3 に答える 3

1

JWindow.isFocusableWindowのJavaDocを見てください。JWindow には、所有者がいて所有者が表示されていない限り、フォーカスされたウィンドウにすることはできません。デフォルトのコンストラクターを使用しているため、JWindowには共有所有者があります。asnはフォーカスできません。フォーカスが合っていない場合、他の場所をクリックしたときにフォーカスが失われたことを検出できません。

に変更JWindowし、への呼び出しの前にへのJFrame呼び出しを追加しましたが、それは私のために機能しています。これらの変更でうまくいかない場合は、使用しているJavaのバージョンを投稿してください。setUndecorated(true);setVisiblejava -fullversion

于 2009-12-17T16:52:29.960 に答える
0

Windows上のJava6では、提供したコードでポップアップを表示することさえできません。一方、スーパークラスをJFrameに変更すると、ウィンドウの外側をクリックするとポップアップが消えて、希望どおりに機能します。JWindowスーパークラスとして使用しているのではなく、使用している理由はありますJFrameか?ボーダーレス/タイトルレスウィンドウが必要な場合は、(もちろん、表示してパックする前に)を呼び出すことができsetUndecorated(true)ますJFrame

于 2009-09-30T15:53:29.973 に答える
0

MouseExitedメソッド内からメニューが表示されている場合は、メニューを非表示にするのはどうですか?

于 2009-09-30T16:47:41.063 に答える