1

私はJavaが初めてで、いくつかのボタンとドロップダウンメニューを備えたシンプルなGUIを構築しようとしています. なんとか GUI を動作させることができましたが、本当の問題は actionListener メソッドの適切な使用についてです。アクションをボタンに割り当てるために、各 actionListener を独自のクラスに挿入しました。これはコードです。

public class GUI implements something
{
    public static ClientGUI App;
    private JFrame chatWin;
    private JMenuBar menubar;
    private JMenu x;
    private JMenu y;
    private JMenuItem exit;
    private JMenuItem about;


    public GUI()
    {

               /* 
                * some code and parameters
                */

            //creating the menu bar
            JMenuBar menubar = new JMenuBar();
            chatWin.setJMenuBar(menubar);

            JMenu x= new JMenu("menu1");
            menubar.add(x);
            JMenuItem exit = new JMenuItem("menu2");
            x.add(exit);

            JMenu y= new JMenu("Help");
            menubar.add(help);
            JMenuItem about = new JMenuItem("inner menu1");
            y.add(about);

            //action listener for the exit button 
            class exitaction implements ActionListener
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.exit(0);
                }
            }
            exit.addActionListener(new exitaction());

            //action listener for the about button
            class aboutaction implements ActionListener
            {
                public void actionPerformed(ActionEvent e)
                {
                    //some code
                }

            }
        }

    public static void main (String args[])
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                App = new GUI();
            }
        });
    }


}

そのコードはきちんとしていて正しいと考えられていますか? 改善できること、または変更する必要があることはありますか?

4

4 に答える 4

2

私はルールに従います:

アクションの実装が優れている場合は、内部クラスに入れます。

    public MyFrame extends JFrame {

       // componentes creating, etc

        private static class MyShortAction implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e){
                // some big implementation
            }

        }

    }

短いときは、匿名のクラスに入れます。

myButton.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e){
        // some small code
    }

});

他のコンポーネントで使用されている場合は、トップレベルのクラスに抽出します。

public class MyAction implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e){
        // some small code
    }
}
于 2012-12-11T18:24:39.040 に答える
0

ボタンにアクション リスナーを追加する簡単な直接的な方法:

//Create the button
JButton button_save = new JButton("Save");
add(button_save);

// Create the listener
button_save.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent arg0) {
    //do your stuff when button clicked
    //ex: disable the button
    button_save.setEnabled(false);
  }
});
于 2012-12-11T18:09:39.407 に答える
0

それは機能しますが、ボタンごとにネストされたクラスを作成する代わりに、別のクラスまたはメインクラスに実装することもできます...

public class GUI implements something,ActionListener
{
    //...
    public GUI()
    {
        //...
        exit.setActionListener(this);
        about.setActionListener(this);
        //...
    }
    public void actionPerformed(ActionEvent e)
    {
        Object source = e.getSource();
        if(source == exit)
        {
            System.exit(0);
        } else if(source == about)
        {
            //action
        }
    }
}

アクション コマンドをアイテムに設定し、オブジェクトの代わりに文字列を比較することもできます。

public class GUI implements something,ActionListener
{
    //...
    public GUI()
    {
        //...
        exit.setActionCommand("exit");
        exit.addActionListener(this);

        about.setActionCommand("about");
        about.addActionListener(this);
        //...
    }
    public void actionPerformed(ActionEvent e)
    {
        String action = e.getActionCommand();
        if("exit".equals(action))
        {
            System.exit(0);
        } else if("about".equals(action))
        {
            //action
        }
    }
}
于 2012-12-11T18:05:42.813 に答える
0

私見あなたのコードはすでに正しいです(つまり、機能していますよね)。残りはほとんど好みの問題 (およびコードの使いやすさ) です。たとえば、後でコードを再利用したり、まだ検討していなかった機能やその他のボタンをプログラムに追加したりすることができます。したがって、次の経験則を試してください。

  • 内部クラスは避けてください。そのクラスのオブジェクトを別の場所でいつインスタンス化したいかわかりません。したがって、各クラスに 1 つのファイルを使用します (ところで、クラスは大文字で始める必要があります)。
  • ActionListener の各実装を独自のクラスに配置します。これがプロジェクトを爆破することはわかっていますが、すべてのコードが明確に整理され、機能を再利用することさえできます. たとえば、終了ボタン。プログラムの別の場所に 2 番目の終了ボタンを配置することにした場合、これら 2 つのボタンに同じ ActionListener を設定して、同じ機能を持たせることができます。

コンパイラにとっては何の違いもありませんが、プロジェクトが成長し始め、ますます複雑になったときのあなたにとっては違いはありません。

于 2012-12-11T20:22:35.887 に答える