代码如何使用按钮内的对象?
How can code use an object inside a button?
我有一个问题。我想使用按钮外的对象,但收到错误消息:
Local variable es defined in an enclosing scope must be final or effectively final
File inputfile = new File("./input.txt");
testobject to = null;
try {
Scanner inputscan = new Scanner(inputfile);
String text1 = inputscan.nextLine();
String text2 = inputscan.nextLine();
to = new testobject(text1,text2);
inputscan.close();
} catch (Exception e) {
System.err.println(e);
}
JButton btnSave = new JButton("Save");
btnSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
to.setSomething("test");
}
});
显然,我有一个带有构造函数等的 class...但是我有一个问题,我无法到达按钮内的对象。
您想在匿名 类 中使用的变量,例如您的 ActionListener
需要是最终的。您正在用 null 初始化变量,稍后将其更改为根据文本输入创建的对象。
您可以改为使用无参数构造函数创建对象,并使用 setter 来设置 testobject
中的值。
// Class names should start with a uppercase
testobject to = new testobject();
// Use try-with-resources to close them automatically.
try(Scanner inputscan = new Scanner(inputfile)){
to.setText1(inputscan.nextLine());
to.setText2(inputs can.neytLine());
} catch (Exception e) {
System.err.println(e)
}
JButton btnSave = new JButton("Save");
btnSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
to.setSomething("test");
}
});
或者在 actionPerfromed
方法中初始化变量。缺点是您无法在方法之外访问测试对象。
btnSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try(Scanner inputscan = new Scanner(inputfile)){
testobject to = new testobject(inputscan.nextLine(), inputscan.nextLine());
to.setSomething("test");
} catch (Exception e) {
System.err.println(e)
}
}
});
第一种方法我试过了,可能我做了一些不好的事情,但是没有用。
第二种方法有效,但这会在按钮中创建一个新对象,因此如果我想在按钮外部使用,我需要重新设置所有内容。在我的程序中它非常复杂等等...
所以我创建了一个 Arraylist 的解决方案,我也可以在按钮内外使用它。
ArrayList<testobject> list = new ArrayList<testobject>();
然后我将第一个 (0) 元素设置为我的数据
list.add(new testobject(text1,text2));
之后我可以很容易地使用 class
的方法
list.get(0).setSomething("test");
我有一个问题。我想使用按钮外的对象,但收到错误消息:
Local variable es defined in an enclosing scope must be final or effectively final
File inputfile = new File("./input.txt");
testobject to = null;
try {
Scanner inputscan = new Scanner(inputfile);
String text1 = inputscan.nextLine();
String text2 = inputscan.nextLine();
to = new testobject(text1,text2);
inputscan.close();
} catch (Exception e) {
System.err.println(e);
}
JButton btnSave = new JButton("Save");
btnSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
to.setSomething("test");
}
});
显然,我有一个带有构造函数等的 class...但是我有一个问题,我无法到达按钮内的对象。
您想在匿名 类 中使用的变量,例如您的 ActionListener
需要是最终的。您正在用 null 初始化变量,稍后将其更改为根据文本输入创建的对象。
您可以改为使用无参数构造函数创建对象,并使用 setter 来设置 testobject
中的值。
// Class names should start with a uppercase
testobject to = new testobject();
// Use try-with-resources to close them automatically.
try(Scanner inputscan = new Scanner(inputfile)){
to.setText1(inputscan.nextLine());
to.setText2(inputs can.neytLine());
} catch (Exception e) {
System.err.println(e)
}
JButton btnSave = new JButton("Save");
btnSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
to.setSomething("test");
}
});
或者在 actionPerfromed
方法中初始化变量。缺点是您无法在方法之外访问测试对象。
btnSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try(Scanner inputscan = new Scanner(inputfile)){
testobject to = new testobject(inputscan.nextLine(), inputscan.nextLine());
to.setSomething("test");
} catch (Exception e) {
System.err.println(e)
}
}
});
第一种方法我试过了,可能我做了一些不好的事情,但是没有用。 第二种方法有效,但这会在按钮中创建一个新对象,因此如果我想在按钮外部使用,我需要重新设置所有内容。在我的程序中它非常复杂等等...
所以我创建了一个 Arraylist 的解决方案,我也可以在按钮内外使用它。
ArrayList<testobject> list = new ArrayList<testobject>();
然后我将第一个 (0) 元素设置为我的数据
list.add(new testobject(text1,text2));
之后我可以很容易地使用 class
的方法list.get(0).setSomething("test");