我使用我的主类作为我正在处理的程序的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并发教程。