1

我对 Java 中的内部方法没有什么问题。排队:

dReservation[i].dispose();

我有一个错误:

不能在不同方法中定义的内部类中引用非最终变量 dReservation

我在论坛中阅读了许多主题,但是该问题有两种无效的解决方案:

不能引用在不同方法中定义的内部类中的非最终变量

不能在不同方法中定义的内部类中引用非最终变量 i

为什么非最终“局部”变量不能在内部类中使用,而封闭类的非最终字段可以?

我试图为我的班级设置JDialog[] dReservation字段globalGUIShowReservations)。然后我的错误消失了,但在内部方法 ( actionPerformed) 而不是dReservation[i]is null

当我设置JDialog[] dReservationfinal字段时,历史相同。它是null

bShowReservations = new JButton("Show Reservations");
bShowReservations.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
  JDialog[] dReservation = new JDialog[10000];

  for(Object o: reservations)
  {
    rez = (Reservations)o;
    reservation.append(rez.getGroup());

    dReservation[i] = new JDialog();
    dReservation[i].setSize(400, 300);
    dReservation[i].setLocationRelativeTo(null);
    dReservation[i].setVisible(false);
    dReservation[i].setLayout( null );
    dReservation[i].setTitle("Edition");

    bEditAccept = new JButton("Edit");
    bEditAccept.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent arg0) {
            rez.setTeacher(cEditTeacher.getSelectedItem().toString());
            dao.update(rez);
            dReservation[i].dispose();
        }
    });
    bEditAccept.setSize(160, 24);
    bEditAccept.setLocation(10, 200);
    dReservation[i].add(bEditAccept);
  }
}
});

你可以帮帮我吗?我想JDialog在我的内部方法中看到适当的而不是null.

4

1 回答 1

0

很难回答,因为代码不完整,上面的代码没有多大意义。我将解释它实际上做了什么,因为我认为它不会做你想要它做的事情。

该代码创建了一个标记为“显示预订”的按钮。单击此按钮时,会创建一个包含一万个(!)JDialog 实例的数组(为什么?)。所有这些对话框都是空的。

然后,完成一个循环,对保留进行迭代。对于每个预订,都会创建一个新的 JDialog,其中包含一个名为“Edit”的新按钮,单击该按钮会关闭对话框。最后一个对话框存储在索引 i 处的巨型数组中。所有其他的都是免费创建的,因为它们被下一个替换,在数组中的相同索引处。

因此,在循环结束时,您为每个预订创建了一个对话框,但仅将其中一个存储在一个巨大的数组中。而且由于这个巨大的数组是一个局部变量,所以无论如何都没有人可以使用这个对话框,因为数组及其唯一的对话框超出了范围。所以你的动作监听器相当于下面的一个,但是以一种非常缓慢和低效的方式:

bShowReservations.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent arg0) {
        for (Object o: reservations) {
            rez = (Reservations) o;
            reservation.append(rez.getGroup());
        }
    }
}

也不是说您的代码充满了不良做法。您没有使用通用集合,您正在设置按钮的大小,您没有使用布局管理器而是设置任意位置......

如果您告诉我们代码该做什么,我们可以帮助您做到这一点。

于 2012-12-24T16:06:48.923 回答