Java-如何获取变量形式JTeXtField并在算法J48中使用
我想用Java创建一个小应用程序-一个按钮和一个JTextField。此外,我使用从J48算法生成“树”的代码(当我查找WEKA totorial时,我在web中找到代码)。此代码中应使用可变形式的文本字段(实现J48)。我创建了这样的东西,但它不起作用:Java-如何获取变量形式JTeXtField并在算法J48中使用,java,swing,static,compiler-errors,Java,Swing,Static,Compiler Errors,我想用Java创建一个小应用程序-一个按钮和一个JTextField。此外,我使用从J48算法生成“树”的代码(当我查找WEKA totorial时,我在web中找到代码)。此代码中应使用可变形式的文本字段(实现J48)。我创建了这样的东西,但它不起作用: package visio; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; impo
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());
}
}
帮帮我。我有一个错误:不能从静态上下文引用非静态变量。这意味着您正在使用“temp”,一个在静态main方法中非静态的变量
data.setClassIndex(data.numAttributes() - temp); // you use it here
如果您想修复它,您需要做的就是更改变量“temp”的声明:
但是,请确保您能够编写您不理解的代码是毫无意义的;),还要记住,如果方便的话,最好避免使用静态变量
另一个选项是将主方法中的代码移动到“Visio”的构造函数中。由于“Visio”的构造函数不是静态的,因此可以访问所有实例变量而不会出错
这就像将代码从“main”复制粘贴到“Visio”一样简单,只需确保将“okienko.(whatever)”更改为“this.(whatever)”。(虽然您不必输入“this”关键字,但在引用继承成员时,我还是喜欢这样做;它使源代码更加清晰).请不要建议他使用静态变量,因为这样会破坏OOP合规性,并且实例变量可以正常工作。@HovercraftFullOfEels在他的例子中,使一个变量为静态比使其余代码为“非静态”容易得多“这更容易,但它是错误的,只会强化一个坏习惯。”我来这里是为了回答他的问题,而不是教他编程实践。无论如何,我添加了一个解决方案来保持他的变量实例。@jesuplsplus“我来这里是为了回答他的问题,而不是教他编程实践”,我认为它们是相互包容的目标。你不应该在没有其他方法的情况下尝试一种方法——你需要从静态main方法中获取大部分代码,而应该使用对象、实例变量和非静态方法来解决你的问题。考虑一下java和面向对象编程中的一些入门教程。
static int temp;