不明白为什么我的代码中显示以下错误:无法从静态上下文引用非静态变量

时间:2014-07-24 18:49:53

标签: java swing static

我看了几篇关于上述错误的帖子。但是我不明白我的代码的哪一部分是不正确的。

该错误适用于以下行: tempPic.setLocation(0,slotIDArray [0]);

slotIDArray是一个非静态变量。 newBloodhound,tempPic也是非静态变量。我很困惑为什么会出现与此事有关的错误。

上下文: 我的代码产生一个GUI,其中左侧有一个分为42个“单元”的面板,每个单元都支持DTPicture类型(所有这些DTPicture单元都被初始化为null。我使用slotIDArray来保持位置的整体引用即,pos 1对应于Y = 38等。仅仅为了后续开发的测试目的,我为Bloodhound组件分配了一个随机DTPicture。由于DTPicture是一个组件,我可以在框架/面板上设置它的位置。所以我打电话testPic.setLocation(0,slotIDArray [0]);查看该图片是否会被转移到位于该特定Y位置的DTPicture“单元格”。

感谢您的帮助。

以下是我的代码的相关部分:

public class RackBuilderTool extends JPanel{
    public int[] slotIDArray = new int[42];

    public RackBuilderTool() {
        super(new GridLayout(42, 1));

        //DTPicture[] rackSlotArray = new DTPicture[42];
        for (int i = 0; i < 42; i++) {
                //add(new ComponentLabel());
            DTPicture temp = new DTPicture(null);
            //address of DTPicture Component
            slotIDArray[i] = add(temp).getY();


            /*
            add(new ComponentLabel("Bloodhound", "alexi.jpg", 
                    "Bloodhound label
            */
        }
    }
    private static void createAndShowGUI() {
        JFrame frame = new JFrame("Rack Builder Tool");
        frame.setPreferredSize(new Dimension(400, 600));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final RackBuilderTool rackBuilder = new RackBuilderTool();
        rackBuilder.setOpaque(true);
        frame.add(rackBuilder);
        frame.pack();

        JButton bloodhoundButton = new JButton("Bloodhound");
        JButton computeButton = new JButton("Compute");
        JButton powershelfButton = new JButton("Powershelf");
        JButton serverButton = new JButton("Server");
        JButton storageButton = new JButton("Storage");
        JButton switchButton = new JButton("Switch");

        bloodhoundButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("Clicked Bloodhound Button");
                //System.out.println(rackBuilder.slotRowArray[2].getLocation());
                //need to fix this. Static variable cannot be used.
                Bloodhound newBloodhound = new Bloodhound();
                DTPicture tempPic = newBloodhound.getPicture();
                tempPic.setLocation(0, slotIDArray[0]);  
            }
        });
    JToolBar rackToolBar = new JToolBar("Components", JToolBar.VERTICAL);
            rackToolBar.add(bloodhoundButton);
            rackToolBar.add(computeButton);
            rackToolBar.add(powershelfButton);
            rackToolBar.add(serverButton);
            rackToolBar.add(storageButton);
            rackToolBar.add(switchButton);
            frame.add(rackToolBar, BorderLayout.EAST);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
      }
   }


    class Bloodhound extends RackComponent {
        static private int quantity = 0;
        private DTPicture compPic = new DTPicture(
                DTPicture.createImageIcon("images/alexi.jpg", "alexi").
                        getImage());

    public Bloodhound() {
            ++quantity;
        }
        public DTPicture getPicture() {
            return compPic;
        }
        public String getPartNumber() {
            return partNumber;
        }
        public int getQuantity () {
            return quantity;
        }
        public void setPartNumber(String...partNumbers) {
            this.partNumber = partNumbers[0];
        }
    }

3 个答案:

答案 0 :(得分:1)

slotIDArray是类的非静态变量,您尝试在静态方法中访问它。因此,您遇到了这样的错误。

只需使slotIDArray静态或从方法定义中移除静态(如果您可以在没有任何问题的情况下执行此操作)来访问它!

答案 1 :(得分:0)

无法从静态上下文引用

非静态变量 - 当您尝试访问非静态时会发生这种情况 或对象的成员变量。这应该是显而易见的。

private static void createAndShowGUI()是一个静态方法,您尝试使用的方法访问静态变量位置 tempPic.setLocation(0, slotIDArray[0]);

答案 2 :(得分:0)

newBloodhoundtempPic是静态方法中定义的局部变量。因此,从该方法访问它们没有问题。

另一方面,

slotIDArray是您班级的非静态成员,您无法在静态方法中访问它。