代码如何使用按钮内的对象?

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");