首先,我想说的是,我现在仅使用Java工作了1个月。这可能是一个非常简单的问题。我搜索了一下,发现经典的水果例子对我来说没有任何意义。我花了几个小时研究它,试图弄清楚如何应用它以使其工作。这对我来说没有任何意义,因为每个人都说明了如何使用两行代码且没有结构语句来获取和设置属性。对于如何从静态与非静态进行交谈,我将不胜感激。
我想从单独的静态类的OBD2nerForm类的文本框中设置setText。
public class OBD2nerForm extends java.awt.Frame {
/** Creates new form OBD2nerForm */
public OBD2nerForm() {
initComponents();
} ....................................
public String setText(String text){
this.jFormattedTextField1.setText(text);
}
我想我对此处定义的表单的实例具有静态引用。
public class Status {
public static OBD2nerForm form = new OBD2nerForm();
从我的主叫这样
public class obd2ner {
public static void main(String[] args) throws IOException {
Status.form.main(args);
然后,当我尝试调用它时。创建表单时,Status.form.getText为我提供了初始值。当我setText时,它不会更改屏幕上的那个。
我只是为了简单起见显示它。还有许多其他部分。我在串行端口上有一个静态监视器,我希望它捕获要从文本框中发送的下一个数据,然后对其进行递增。
我只是不明白如何在非静态方法上使用getter和setter。它并没有完全按照我的需要去做。好像我在屏幕上看到一个实例,并且它正在使用一个新实例来执行获取和设置。
我按照收到的答案尝试了此操作,但没有成功...
public class OBD2nerForm extends java.awt.Frame {
String X = "";
//尝试增加代码的可运行方法
公共字符串getNewScannerValueRunnable(){
Runnable doWorkRunnable = new Runnable() {
@Override
public void run() {
Status.form.getNewRotatingValue()
;}
};
SwingUtilities.invokeAndWait(doWorkRunnable);
return X;
}
我真的可以使用其他建议。我只是不明白这里要发生什么。
最佳答案
您的表单可以很好地创建,并且只有一个引用,并且最终以该静态变量结尾。到那时为止一切都很好。
您需要注意Swing的一个“秘密”:您不能(明显地)从除Swing线程之外的其他任何线程(也就是事件调度线程)中更改GUI对象的属性。
无论如何,技巧是将属性更改代码作为Runnable
传递给SwingUtilities.invokeAndWait()
或SwingUtilities.invokeLater()
之一。
编辑:
好,让我们备份。您的表单是基于AWT的,而不是基于Swing的,因此,即使您正确实现了它,我担心使用SwingUtilities
的建议也可能不会对您有所帮助。这次我将尝试给出更具体的提示。
您已经创建了AWT表单的类OBD2nerForm
。该类具有一个构造函数,该构造函数调用initComponents
在屏幕上设置一些GUI组件。
该类还具有一个称为setText
的方法,该方法会将其自变量文本放入表单上的字段之一。该方法是一个实例方法,即您所说的不是“静态”方法。
您还有另一个类Status
和一个类字段form
。 form
的初始化程序调用OBD2nerForm
的构造函数。这将创建表单的实例并将其存储在form
中;但是我没有看到对表单进行show()
或setVisible()
调用以实际显示它。
这是麻烦的最初迹象:
public class obd2ner {
public static void main(String[] args) throws IOException {
Status.form.main(args);
类名(如
obd2ner
)应以大写字母开头;但这是样式和约定的问题,而不是引起您麻烦的原因。但是,遵循约定可以帮助其他人阅读和调试您的代码。更大的问题是
obd2ner.main()
调用表单的main()
。可以做到这一点,但是通常这表明您做错了事。虽然没有什么可以阻止您将静态
main
方法编码为所需的尽可能多的类,但是只能从外部(即在您运行应用程序时)启动这些主方法中的一个。第一个main
本质上是程序的'boss'方法。“第一个主对象”通常实例化并初始化一些对象。在非GUI应用程序中,
main()
然后可以启动循环或其他控制结构,然后在其中编排其他对象的动作。在GUI应用程序中,main()
通常只实例化然后显示GUI,然后结束。一旦GUI可见,所有进一步的程序活动都由用户在GUI上执行的动作触发。在没有看到您的代码的情况下,我猜测
Obd2nerForm.main()
也会实例化Obd2nerForm并显示它。因此,您可能确实确实有一个实例化但不可见的形式挂在Status.form
上,而另一种实例化了,可见且从Obd2nerForm
中的某个变量引用了。如果要影响该GUI,则需要引用可访问的表格。可能最简单的是:
在
Obd2nerForm
中,声明一个public static Obd2nerForm form
,然后在Obd2nerForm.main
中,在调用构造函数之后,立即将对窗体的引用复制到该变量中。从那时起,您可以使用来访问表单及其方法。 Obd2nerForm.form.setText()
。提醒一下:您似乎有两个
main()
,这需要解决。在应用程序生命周期开始时应做的所有工作都必须放在这些main
之一中,而不是几个。最后,看一下这个方法调用:
Status.form.main(args);
这就是在特定实例上调用方法的语法。但是
Obd2nerForm.main
是一个类方法(您称之为“静态”),因此没有“特定的”可调用,它始终只是属于类本身的那个。这就是为什么调用类方法的语法类似于Obd2nerForm.main(args);
编译器可以让您摆脱编写它的方式,但这不是通常的完成方式,并且表明有些混乱。
在那里...我希望可以使您更进一步。如果仍然有问题,请向PasteBin发布更完整的代码示例,我来看看!
关于java - 有人可以使用我的示例解释如何从静态setText吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3379906/