如何在createContents函数外部修改Label组件的文本?
问题原因与解决方案:SWT组件跨方法访问时无法识别
嘿,这个问题我做SWT开发时也踩过一模一样的坑,核心就是变量作用域的问题!
问题产生的原因
你在createContents()方法里定义的Label1是局部变量,它的作用域仅限于createContents()方法内部。而check()是类的另一个实例方法,根本无法访问其他方法内的局部变量——这就是程序识别不到Label1的本质原因。
你之前定义的oRoll、matchStart这些变量是类的成员变量(哪怕用了static,本质也是类级别的作用域),所以整个类的方法都能访问;SWT的Button、Label这类组件本质也是对象,和基本类型变量一样,只要把它们的作用域提升到类级别,就能跨方法访问了。
具体解决方案
步骤1:将需要跨方法访问的组件声明为类的成员变量
在类的顶部(和public Shell shell;、那些static变量同级),声明你需要在check()里操作的组件:
public class TicTacToeTest { // 原有static变量保持不变 static int oRoll; static int xRoll; static boolean matchStart=false; static boolean Oturn=false; static boolean Xturn=false; static Boolean Owins= false; static Boolean Xwins= false; static int Owin= 0; static int Xwin= 0; static String Block1 = " "; // ... 其他static变量 public Shell shell; // 新增:声明类级别的组件变量 private Label Oroll; private Label Xroll; private Label Label1; // 就是你要在check里访问的Label // 后续方法... }
步骤2:在createContents()中初始化成员变量
把原来的局部变量声明去掉,直接给类成员变量赋值,同时修复你代码里的一个小笔误(把Label1.setBounds写成了Label.setBounds):
public void createContents() { shell = new Shell(); shell.setSize(450, 314); shell.setText("SWT Application"); // 去掉前面的Label,直接给成员变量赋值 Oroll = new Label(shell, SWT.NONE); Oroll.setBounds(294, 215, 29, 15); Oroll.setText("0"); Xroll = new Label(shell, SWT.NONE); Xroll.setText("0"); Xroll.setBounds(371, 213, 29, 15); Label1 = new Label(shell, SWT.NONE); // 修复笔误:把Label改成Label1 Label1.setBounds(268, 75, 120, 15); Label1.setText("Start to activate turn"); // ... 其他组件初始化逻辑 }
步骤3:修复字符串比较的潜在bug(额外提示)
你在check()里用==比较字符串(比如Block1=="O"),这在Java里是错误的!==比较的是对象引用地址,而非字符串内容,应该用equals()方法:
// 原错误代码 if ((Block1=="O"&&Block2=="O"&&Block3=="O")||...) { // 修改后 if ((Block1.equals("O") && Block2.equals("O") && Block3.equals("O")) || ...) {
这样修改后,check()方法就能正常访问Label1并调用setText()方法了。
内容的提问来源于stack exchange,提问作者Jalex Dai
相关产品推荐
相关产品推荐

