Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

2度クリックしないとポップアップメニューが表示されません

JPanel上で左クリックすると丸い緑色の小さな円を表示後
にJPopupMenuを表示するようにしたいのですが、1回左ク
リックすると円のみ表示でポップアップが出ず、もう1回
左クリックするとポップアップメニューが出現し、その後
は1回の左クリックで円及びポップアップメニューが正常
に表示されます。
ネット検索で調べてみた結果、JPanelにフォーカスが無い
ので最初の左クリックでポップアップメニューが動作しな
いのでは?と考えsetFocusable(true)やrequestFocus();
として試してみましたが変化なしでした。
何故1度目の左クリックでポップアップメニューが出現し
ないのかわかりません。
どうか教えて下さい。

コードは以下になります。

public class GameInputP extends JPanel implements 
MouseListener {

    private static final long serialVersionUID = 
1L;
    
    //ファウルゲージ
    private FoulGage fg = new FoulGage();
    //コートライン
    private CoatLine cl = new CoatLine();
    //ゾーンエリアライン
    private ZoneAreaLine zal = new 
ZoneAreaLine();
    //ゾーンエリア番号
    private ZoneAreaNumber zan = new 
ZoneAreaNumber();
    //Aチーム表示
    private ATeamScoreAndTimeOutP 
teamScoreAndTimeOutAP0;
    //Bチーム表示
    private BTeamScoreAndTimeOutP 
teamScoreAndTimeOutBP0;
    //ゲームタイマー
    private GameTimerP gameTimerP0;
    //ポップアップメニュー
    private GameRecordPopup popup;// = new 
GameRecordPopup();
    //サウンド
    private AudioClip Sound = 
Applet.newAudioClip(getClass().getResource("recordPo
int.wav"));
    

    public GameInputP() {
        initComponents();
    }

    private void initComponents() {
        setBackground(Color.white);
        setBorder(new 
LineBorder(Color.black, 2, false));
        setLayout(new GroupLayout());
        add(getTeamScoreAndTimeOutAP0(), new 
Constraints(new Leading(388, 238, 10, 10), new 
Leading(1, 54, 10, 10)));//406,220
        add(getTeamScoreAndTimeOutBP0(), new 
Constraints(new Leading(631, 238, 10, 10), new 
Leading(1, 54, 10, 10)));//220
        add(getGameTimerP0(), new 
Constraints(new Leading(371, 530, 10, 10), new 
Leading(555, 61, 10, 10)));//549
        addMouseListener(this);
        //フォーカス
        setFocusable(true);//requestFocus();
        setSize(1251, 611);
    }

    private GameTimerP getGameTimerP0() {
        if (gameTimerP0 == null);
            gameTimerP0 = new 
GameTimerP();
        return gameTimerP0;
    }

    private BTeamScoreAndTimeOutP 
getTeamScoreAndTimeOutBP0() {
        if (teamScoreAndTimeOutBP0 == null);
            teamScoreAndTimeOutBP0 = new 
BTeamScoreAndTimeOutP();
        return teamScoreAndTimeOutBP0;
    }

    private ATeamScoreAndTimeOutP 
getTeamScoreAndTimeOutAP0() {
        if (teamScoreAndTimeOutAP0 == null);
            teamScoreAndTimeOutAP0 = new 
ATeamScoreAndTimeOutP();
        return teamScoreAndTimeOutAP0;
    }

    //コート図関係の描画
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        //ゾーンエリア番号の表示
        zan.paintComponent(g);
        //ゾーンエリアラインの表示
        zal.paintComponent(g);
        //コートラインの表示
        cl.paintComponent(g);
        //ファウルゲージの表示
        fg.paintComponent(g);
    }
    
    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

        //左マウスクリック限定
        if (e.getButton() == 
MouseEvent.BUTTON1) {
            //
            System.out.println("マウス
が"+e.getClickCount()+"回クリックされました。位
置;"+e.getPoint()); 
            //クリック音を鳴らす
            chbxSound.play();
            
            //マウスをクリックした場所を
マーキング
            Graphics g = getGraphics();
            try{   
                //一時的な色彩として
ダークグリーンの塗りつぶし円を表示
                g.setColor(new 
Color(34, 139, 34));   
                
g.fillOval(e.getX()-5, e.getY()-5, 10, 10);
                //コンソール確認用
                
System.out.println("左マウスボタンをクリックしたので
ポップアップメニュー出現");
                //ポップアップメニュ

                popup = new 
GameRecordPopup();
                popup.show(this);
            }finally{
                g.dispose();
            }
        }
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub
        
    }
}

2

回答

6240

閲覧

2件の回答

評価

0

GameRecordPopupクラスを見直しコードを書き換えた結果、自
己解決しました。

評価

0

今更だけど、書き直してみたらちゃんと動いたってのは、割
と良くある話。
ちゃんとやり方が分かっている場合、本当に詰まらない書き
損じをしていることが多いので、下手にコードを追うより速
いこともあるし、良い面もある。
そうでない場合は、レベルアップの機会を自ら回避したこと
になるが。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。