質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.09%

javaでコマンドプロンプトに大量のエラー文

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 505

score 15

希望通りの動作はしてくれるんですが、

「終了ボタンの表示」 と 「終了ボタンの非表示」

ボタンを押すとコマンドプロンプトに大量のエラー文が出てきて困っています。
ご指導よろしくお願いいたします。

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

class MyGlassPane extends  MyMenuFrame02 implements ActionListener{

    private JLabel label1;
    private JButton dispButton;
    private JButton exitButton;

    private JPanel gPane;

    private JPopupMenu popupMenu = new JPopupMenu( "ポップアップメニュー" );
    private JMenuItem popCopyItem = new JMenuItem( "コピー" );
    private JMenuItem popPrintItem = new JMenuItem( "印刷" );
    private JMenuItem popExitItem = new JMenuItem( "<html><font color=red>終了" );

    MyGlassPane(String title){
        super(title);

        label1 = new JLabel( new ImageIcon( "BAnetwork.jpg" ) );
        add( label1, BorderLayout.CENTER ); // イメージを中央に貼り付ける

        dispButton = new JButton( "終了ボタンの表示" ); // 「表示」ボタン
        dispButton.addActionListener( this ); // リスナーの登録
        add( dispButton, BorderLayout.SOUTH  ); // フレームの下部に貼り付ける

        exitButton = new JButton( "終了" ); // 「終了」ボタン
        exitButton.addActionListener( this ); // リスナーの登録

        gPane = (JPanel)this.getGlassPane(); // グラスペインを取り出す
        add( gPane, BorderLayout.NORTH  );
        gPane.add( exitButton ); // 「終了」ボタンをグラスペインに貼り付ける

        pack();

        popupMenu.add( popCopyItem );
        popupMenu.add( popPrintItem );
        popupMenu.addSeparator();
        popupMenu.add( popExitItem );

        popCopyItem.addActionListener( this );
        popPrintItem.addActionListener( this );
        popExitItem.addActionListener( this );

        addMouseListener( new PopupMenuListener() );
    }

    public void actionPerformed( ActionEvent e ){
        JButton jbtn;
        String name = e.getActionCommand(); // ボタンのテキストを取得する

        if( name.equals( "終了ボタンの表示" ) ){ // 「表示」ボタンが押されたら
            jbtn = (JButton)e.getSource(); // イベントからJButtonのオブジェクトを取得
            jbtn.setText( "終了ボタンの非表示" ); // そのボタンのテキストを「非表示」にする
            gPane.setVisible( true ); // グラスペインを可視にする
        }else if( name.equals( "終了ボタンの非表示" ) ){ // 「非表示」ボタンが押されたら
            jbtn = (JButton)e.getSource(); // イベントからJButtonのオブジェクトを取得
            jbtn.setText( "終了ボタンの表示" ); // そのボタンのテキストを「表示」にする
            gPane.setVisible( false ); // グラスペインを非可視にする
        }else if( name.equals( "終了" ) ) // 「終了」ボタンが押されたら
            System.exit( 0 );    

        JMenuItem selectedItem = (JMenuItem)e.getSource();
        if( selectedItem == popCopyItem )
            System.out.println( "ポップアップの「コピー」アイテムが押された" );
        else if( selectedItem == popPrintItem )
            System.out.println( "ポップアップの「印刷」アイテムが押された" );
        else if( selectedItem == popExitItem ){
            System.out.println( "ポップアップの「終了」アイテムが押された" );
            System.exit( 0 );  
        }
        else
            super.actionPerformed( e ); // スーパークラスのハンドラに処理を任せる


    }

    class PopupMenuListener extends MouseAdapter {

        public void mousePressed( MouseEvent e ){
            if( e.isPopupTrigger() )
                popupMenu.show( e.getComponent(), e.getX(), e.getY() );
        }
        public void mouseReleased( MouseEvent e ){
            if( e.isPopupTrigger() )
                popupMenu.show( e.getComponent(), e.getX(), e.getY() );
        }
     }

    public static void main( String [] args )
    {
        MyGlassPane f = new MyGlassPane("MyGlassPane");
        f.setVisible( true );
    }
}

イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2019/06/30 10:27

    例外スタックトレースつぶれて見えないな。
    例外のスタックトレースって基本「atの行」は呼び出し階層だから、
    コードを持っている人以外には無意味なものになるのです。

    なんで画像で全体をあげるのもいいけど縮小してはいけない。
    テキストで at の行以外を上げる 必要があります。

    キャンセル

  • Ritsu

    2019/06/30 14:13

    コメントありがとうございます。
    そうなんですね、ご指摘ありがとうございます!
    次回から at 文以外をテキストであげようと思います。

    キャンセル

回答 2

checkベストアンサー

+3

JMenuItem selectedItem = (JMenuItem)e.getSource();


たぶんここでJButtonが目的の型にキャストできないって言ってる

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/30 01:16

    回答ありがとうございます!

    selectedItemを使わず、終了ボタン表示のところと同じように
    String name = e.getActionCommand();
    を使ったらエラー文は出なくなりました!
    でも、ポップアップの終了だけが機能しなくなってしまったのですが、原因わかりますでしょうか、、、


    public void actionPerformed( ActionEvent e ){
    JButton jbtn;
    String name = e.getActionCommand(); // ボタンのテキストを取得する

    if( name.equals( "コピー" ) )
    System.out.println( "ポップアップの「コピー」アイテムが押された" );
    else if( name.equals( "印刷" ) )
    System.out.println( "ポップアップの「印刷」アイテムが押された" );
    else if( name.equals( "終了" ) ){
    System.out.println( "ポップアップの「終了」アイテムが押された" );
    System.exit( 0 );
    }

    if( name.equals( "終了ボタンの表示" ) ){ // 「表示」ボタンが押されたら
    jbtn = (JButton)e.getSource(); // イベントからJButtonのオブジェクトを取得
    jbtn.setText( "終了ボタンの非表示" ); // そのボタンのテキストを「非表示」にする
    gPane.setVisible( true ); // グラスペインを可視にする
    }else if( name.equals( "終了ボタンの非表示" ) ){ // 「非表示」ボタンが押されたら
    jbtn = (JButton)e.getSource(); // イベントからJButtonのオブジェクトを取得
    jbtn.setText( "終了ボタンの表示" ); // そのボタンのテキストを「表示」にする
    gPane.setVisible( false ); // グラスペインを非可視にする
    }else if( name.equals( "終了" ) ) // 「終了」ボタンが押されたら
    System.exit( 0 );

    else
    super.actionPerformed( e ); // スーパークラスのハンドラに処理を任せる


    }

    キャンセル

+1

註: 直接的な回答ではありません。

原因については、既にswordoneさんがご指摘のとおりです。


そもそもなぜこのようなバグが発生し得るかというと、
アクションの判別をactionPerformedに任せてしまっているからです。

一つのアクションに対して一つのアクションリスナーを作った方が見通しが良くなります。
匿名クラスやラムダ式を上手く用いれば、コードが過度に煩雑になることもありません。

var btn1 = new JButton("ボタン1");
btn1.addActionListener(
    e -> System.out.println("ボタン1が押されたよ")
);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/30 14:44

    回答ありがとうございます。
    なるほど、ありがとうございます!
    今後はなるべく分けて処理を書きたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る