2

我想在 Java 中创建一个小应用程序——一个按钮和一个 JTextField。此外,我使用从 J48 算法生成“树”的代码(我在寻找 WEKA totorial 时在网上找到代码)。可变表单文本字段应该在此代码中使用(实现 J48)。我创建了这样的东西,但它不起作用:

package visio;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;



import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.FileReader;

import javax.swing.JFrame;

import weka.classifiers.trees.J48;
import weka.core.Instances;
import weka.gui.treevisualizer.PlaceNode2;
import weka.gui.treevisualizer.TreeVisualizer;

public class Visio extends JFrame implements ActionListener {

    int temp;
    JTextField pole;
    JButton button = new JButton("bb");

    public Visio() {

        setSize(400, 400);
        setTitle("okno");

        setLayout(null);


        button.setBounds(50, 50, 100, 20);
        add(button);

        button.addActionListener(this);

        pole = new JTextField("");
        pole.setBounds(20, 70, 150, 20);
        add(pole);



    }

    public static void main(String[] args) throws Exception {

        Visio okienko = new Visio();
        okienko.setDefaultCloseOperation(EXIT_ON_CLOSE);
        okienko.setVisible(true);

        // train classifier
        J48 cls = new J48();

        BufferedReader reader;
        reader = new BufferedReader(new FileReader("E:/Desktop/weka.arff"));
        Instances data = new Instances(reader);
        reader.close();




        /* Instances data = new Instances(new BufferedReader(new FileReader(args[0])));*/
        data.setClassIndex(data.numAttributes() - temp);
        cls.buildClassifier(data);

        // display classifier
        final javax.swing.JFrame jf =
                new javax.swing.JFrame("Weka Classifier Tree Visualizer: J48");
        jf.setSize(500, 400);
        jf.getContentPane().setLayout(new BorderLayout());
        TreeVisualizer tv = new TreeVisualizer(null,
                cls.graph(),
                new PlaceNode2());
        jf.getContentPane().add(tv, BorderLayout.CENTER);
        jf.addWindowListener(new java.awt.event.WindowAdapter() {
            @Override
            public void windowClosing(java.awt.event.WindowEvent e) {
                jf.dispose();
            }
        });

        jf.setVisible(true);
        tv.fitToScreen();


    }

    @Override
    public void actionPerformed(ActionEvent e) {


        temp = Integer.parseInt(pole.getText());


    }
}

帮帮我。我有一个错误:不能从静态上下文中引用非静态变量

4

1 回答 1

1

这意味着您正在使用“temp”,这是一个在您的静态主方法中不是静态的变量。

data.setClassIndex(data.numAttributes() - temp); // you use it here

如果您想修复它,您所要做的就是更改“temp”的变量声明:

static int temp;

但是请确保您了解静态的含义,能够编写您不理解的代码是没有意义的;),还请记住,如果方便,最好避免使用静态变量。

另一种选择是将主要方法中的代码移动到“Visio”的构造函数中。由于“Visio”的构造函数不是静态的,因此您可以访问所有实例变量而不会出错。

这就像将代码从“main”复制粘贴到“Visio”一样简单,只需确保将“okienko.(whatever)”更改为“this.(whatever)”即可。(虽然您不必输入“this”关键字,但在引用继承的成员时我还是喜欢这样做;它使源代码更清晰)。

于 2012-12-16T02:59:36.820 回答