无法在public()中访问JPanel

时间:2012-12-19 03:00:35

标签: java swing variables jpanel jbutton

最近我尝试制作一个简单的程序,需要在屏幕上多次移动一个按钮,但为了做到这一点,我必须能够从代码的某些部分访问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做任何事情。

2 个答案:

答案 0 :(得分:5)

如果你需要访问一个变量,在这里你的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

解决方案是不要重新声明变量而不是使用类字段:

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???

答案 1 :(得分:0)

将buttonMoverPanel设为类lavel变量,如下所示。

public class ButtonMover extends 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);

        }

        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
               }
           }
}