4

最近、画面上でボタンを数回動かす必要がある簡単なプログラムを作成しようとしましたが、これを行うには、コードの特定の部分からJPanelにアクセスできる必要があります。できる、または別の方法を見つけることができます。これが私が抱えている問題を特定する小さなプログラムです。

public class ButtonMover extends JFrame
{

    public static void main(String[] args) {

        new ButtonMover();
    }
        JButton actionButton;

        public ButtonMover() {
            JPanel buttonMoverPanel = new JPanel();
            buttonMoverPanel.setLayout(new GridBagLayout());
            this.add(buttonMoverPanel);
            this.setSize(500,500);
            this.setResizable(true);
            this.setVisible(true);

            JButton actionButton = new JButton("Testing Button");
            buttonMoverPanel.add(actionButton);

            ClickListener c = new ClickListener();

            actionButton.addActionListener(c);

        }

        private class ClickListener
                    implements ActionListener
           {
               public void actionPerformed(ActionEvent e)
               {

                       if (e.getSource() == actionButton)
                            buttonMoverPanel.add(new JLabel("Testing Label"));
                            //insert code to move button here
               }
           }
}

| buttonMoverPanel.add(new JLabel( "Testing Label")); | その領域からbuttonMoverPanelを参照できないように見えるため、行が機能しない唯一の部分です。実際にはエラーは発生しませんが、actionButtonが何も実行できなくなります。

4

2 に答える 2

5

変数(ここではbuttonMoverPanel)にアクセスする必要がある場合は、メソッドまたはコンストラクターで宣言して、そのメソッドまたはコンストラクターでのみ表示されるようにして、変数を非表示にしないでください。いいえ、クラス全体で表示されるように、クラスで宣言します。

繰り返しになりますが、このコードの1つの改善点は、actionButton JButtonで現在行っているのとまったく同じように、クラスでbuttonMoverPanelを宣言することです。

編集:actionButton変数をシャドウイングしている-コンストラクターで再宣言しているため、GUIに追加されたボタンはactionButtonクラスフィールドによって参照されません。クラスで再宣言しないでください。

言い換えると、示された行は、完全に新しいactionButton変数を作成します。これは、コンストラクターでのみ表示されます。

JButton actionButton;
JPanel buttonMoverPanel = new JPanel();

public ButtonMover() {
  buttonMoverPanel.setLayout(new GridBagLayout());
  this.add(buttonMoverPanel);
  this.setSize(500, 500);
  this.setResizable(true);
  this.setVisible(true);

  JButton actionButton = new JButton("Testing Button"); // ****** here

解決策は、変数を再宣言せずに、クラスフィールドを使用することです。

JButton actionButton;
JPanel buttonMoverPanel = new JPanel();

public ButtonMover() {
  buttonMoverPanel.setLayout(new GridBagLayout());
  this.add(buttonMoverPanel);
  this.setSize(500, 500);
  this.setResizable(true);
  this.setVisible(true);

  actionButton = new JButton("Testing Button"); // ****** Note the difference???
于 2012-12-19T03:02:31.960 に答える
0

以下のように、buttonMoverPanelをクラスlavel変数として作成します。

パブリッククラスButtonMoverはJFrameを拡張します
{{

    public static void main(String [] args){

        new ButtonMover();
    }
        JButton actionButton;
        JPanel buttonMoverPanel;

        public ButtonMover(){
            buttonMoverPanel = new JPanel();
            buttonMoverPanel.setLayout(new GridBagLayout());
            this.add(buttonMoverPanel);
            this.setSize(500,500);
            this.setResizable(true);
            this.setVisible(true);

            JButton actionButton = new JButton( "Testing Button");
            buttonMoverPanel.add(actionButton);

            ClickListener c = new ClickListener();

            actionButton.addActionListener(c);

        }

        プライベートクラスClickListener
                    ActionListenerを実装します
           {{
               public void actionPerformed(ActionEvent e)
               {{

                       if(e.getSource()== actionButton)
                            buttonMoverPanel.add(new JLabel( "Testing Label"));
                            //ここにボタンを移動するコードを挿入します
               }
           }
}
于 2012-12-19T03:09:46.357 に答える