最近,我尝试制作一个简单的程序,该程序需要多次在屏幕上移动一个按钮,但是要做到这一点,我必须能够从代码的某些部分访问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(新的JLabel(“测试标签”)); |行是唯一行不通的部分,因为我似乎无法从该区域引用buttonMoverPanel。尽管它实际上并不会导致任何错误,但可以防止actionButton做任何事情。

最佳答案

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

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

编辑:您正在隐藏您的actionButton变量-您在构造函数中重新声明了它,以便actionButton类字段不引用添加到GUI的按钮。不要在课堂上重新声明它。

换句话说,指示的行创建了一个全新的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

解决方案是不重新声明变量而是使用class字段:
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???

10-06 10:03