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"));| line 是唯一不起作用的部分,因为我似乎无法从该区域引用 buttonMoverPanel。虽然它实际上不会导致任何错误,但它会阻止 actionButton 执行任何操作。

4

2 回答 2

5

如果您需要访问一个变量,这里是您的 buttonMoverPanel,则不要通过在方法或构造函数中声明它来隐藏它,使其仅在该方法或构造函数中可见。不,在类中声明它,以便它在整个类中可见。

同样,此代码的一项改进是在类中声明 buttonMoverPanel,就像您当前对 actionButton JButton 所做的一样。

编辑:您正在隐藏您的 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
{

    公共静态无效主要(字符串[]参数){

        新的按钮移动器();
    }
        JButton 动作按钮;
        JPanel buttonMoverPanel ;

        公共 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("测试按钮");
            buttonMoverPanel.add(actionButton);

            ClickListener c = new ClickListener();

            actionButton.addActionListener(c);

        }

        私有类 ClickListener
                    实现 ActionListener
           {
               公共无效actionPerformed(ActionEvent e)
               {

                       if (e.getSource() == actionButton)
                            buttonMoverPanel.add(new JLabel("测试标签"));
                            //在此处插入移动按钮的代码
               }
           }
}
于 2012-12-19T03:09:46.357 回答