2

Java で小さなアプリケーションを作成したいと思います。1 つのボタンと 1 つの JTextField.さらに、J48 アルゴリズムから「ツリー」を生成するコードを使用します (WEKA totorial を探しているときに Web でコードを見つけます)。このコードで使用されます (実装 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

これは、静的な main メソッドで静的ではない変数である「temp」を使用していることを意味します。

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

修正したい場合は、「temp」の変数宣言を変更するだけです。

static int temp;

しかし、 static が何を意味するのかを必ず学んでください。理解できないコードを記述しても意味がありません;)また、都合が良ければ static 変数を避けるのが最善であることも忘れないでください。

もう 1 つのオプションは、メイン メソッドのコードを "Visio" のコンストラクターに移動することです。「Visio」のコンストラクターは静的ではないため、エラーを発生させることなくすべてのインスタンス変数にアクセスできます。

コードを「main」から「Visio」にコピーアンドペーストするのと同じくらい簡単ですが、「okienko.(何でも)」を「this.(何でも)」に変更してください。(「this」キーワードを入力する必要はありませんが、継承されたメンバーを参照する場合はとにかく入力するのが好きです。これにより、ソース コードがより明確になります)。

于 2012-12-16T02:59:36.820 に答える