如何从另一个类访问Main类中的Variable



我使用我的主类作为我正在处理的程序的UI,在另一个类中,我有一个循环在运行,直到它失去网络连接。所述字段:

lastCrashField = new JLabel("",SwingConstants.CENTER);
lastCrashField.setBounds(80,180,200,30);
lastCrashField.setBorder(blackLine);
totalCrashField = new JLabel("",SwingConstants.CENTER);
totalCrashField.setBounds(80,240,200,30);
totalCrashField.setBorder(blackLine);

我如何从另一个类更新UI中的这两个字段?我已经四处寻找了一段时间,到目前为止,我还处于空白状态,也许我需要重新思考我从它们的基础处理这些字段的方式。。。

你说:

如何从另一个类访问Main类中的Variable

要直接回答您的问题,请选择以下方法之一:

  • 将对每个字段的引用作为参数传递给另一个类的对象上的方法
  • 使两个JLabel小部件的实例成员。将它们标记为非private,以便其他类的对象直接访问

第一个项目符号的代码。

public class CollisionForm extends … 
{
// Member fields
private JLabel lastCrashField, totalCrashField ;
// In constructor, populate those two field references.
…
// Pass references to each of the two fields to your logic method doing some work to produce fresh data.
void whatever() 
{
SomeHelperObject someHelperObject = new SomeHelperObject() ;
someHelperObject.updateCrashFields( lastCrashField , totalCrashField ) ;
}
}
public class SomeHelperClass
{
// Passing two references to JLabel objects.
void someLogic( JLabel lastCrash , JLabel totalCrash ) 
{
lastCrash.setText( … ) ;
totalCrash.setText( … ) ;
}
}

第二个项目符号的代码。

public class CollisionForm extends … 
{
// Member fields
public JLabel lastCrashField, totalCrashField ;  // Public, not private.
// In constructor, populate those two field references.
…
void whatever() 
{
SomeHelperObject someHelperObject = new SomeHelperObject( this ) ;  // Pass instance of Swing form (or controller) to the helper class constructor.
someHelperObject.updateCrashFields() ;
}
}
public class SomeHelperClass
{
// Member fields
CollisionForm form ;
// Receiving instance of `CollisionForm` in the constructor of this class.
SomeHelperClass( CollisionForm collisionForm ) 
{
this.form = collisionForm ;
}
void someLogic() 
{
this.form.lastCrashField.setText( … ) ;
this.form.totalCrashField.setText( … ) ;
}
}

但是我不建议使用这两种方法来处理Swing小部件。继续阅读。

你说:

UI中来自不同类别的2个字段

通常情况下,您应该而不是让其他类直接操作GUI小部件。

最好让包含/管理小部件的对象(GUI布局对象或控制器对象(要求其他类来完成工作。任何结果数据都应该返回到布局/控制器,然后由其更新小部件。

public class CollisionForm extends … 
{
// Member fields
private JLabel lastCrashField, totalCrashField ;  
// In constructor, populate those two field references.
…
void whatever() 
{
SomeHelperObject someHelperObject = new SomeHelperObject() ;  // Passing nothing about widgets. This other class remains blissfully ignorant of anything related to Swing.
List< Integer > freshCrashData = someHelperObject.someLogic() ;
this.lastCrashField.setText( freshCrashData.get( 0 ) ) ;
this.totalCrashField.setText( freshCrashData.get( 1 ) ) ;
}
}
// This version of our `SomeHelperClass` class knows nothing about Swing nor the widgets on our form.
public class SomeHelperClass
{
List< Integer > someLogic()  // <-- Instead of `void`, return data
{
return List.of(
… ,  // Last crash data.
…    // Total crash data.
);       // The calling method on the Swing form uses this data in this returned `List` to update its own widgets. 
}
}

提示:在Java 16+中,我将使用新的记录功能来定义一个类,该方法将返回该类的实例,而不是笨拙的模糊List

你说:

我有一个循环在运行,直到它失去网络连接

这听起来像是在使用后台线程。

小心:永远不要从另一个线程访问Swing小部件使用";SwingWorker;类,后台线程通过这些类请求Swing自己的UI线程更新其小部件。

Stack Overflow已经对Swing线程进行了广泛的介绍。因此,请搜索此网站了解更多信息。阅读Oracle的Swing并发教程。

相关内容

最新更新