Java:来自其他类的布尔值不更改值/if语句不工作
所以我创建了一个名为“Homescreen”的类的对象,它是未定义的。单击按钮后,对象被初始化,线程开始检查布尔值“ScanForSpywares”是否为真。如果为true,则执行特定任务。默认情况下,布尔值为false,单击后通过按钮将其设置为trueJava:来自其他类的布尔值不更改值/if语句不工作,java,Java,所以我创建了一个名为“Homescreen”的类的对象,它是未定义的。单击按钮后,对象被初始化,线程开始检查布尔值“ScanForSpywares”是否为真。如果为true,则执行特定任务。默认情况下,布尔值为false,单击后通过按钮将其设置为true Thread liveCheck = new Thread(new Runnable(){ @Override public synchronized void run(){ while(running){
Thread liveCheck = new Thread(new Runnable(){
@Override
public synchronized void run(){
while(running){
try{
if(serv.connection!=null){
if(serv.connection.isClosed()){
btnDisconnect.setEnabled(false);
btnConnect.setEnabled(true);
}else if(!serv.connection.isClosed()){
btnConnect.setEnabled(false);
btnDisconnect.setEnabled(true);
}
}else{
btnDisconnect.setEnabled(false);
}
if(isHome){
btnHome.setEnabled(false);
}else if(!isHome){
btnHome.setEnabled(true);
}
/* THIS IS THE PROBLEM (THE ONE BELOW) */
if(sc!=null){
// The code works fine till here
if(sc.ScanForSpywares){
serv.LoadMYSQLSettings();
System.out.println("works");
sc.ScanForSpywares=false;
}
}
}catch(Exception e){
}
}
}
});
这是另一个类的代码。一切正常,但当我点击“扫描”按钮时,什么也没发生。所以我试着打印出一条简单的信息,结果发现它根本就不存在。你知道可能是什么吗..我已经工作了很长时间,所以可能是一个愚蠢的问题,我的大脑无法检测到:/
public class HomeScreen extends JFrame {
private JPanel contentPane;
public JList list;
public DefaultListModel model = new DefaultListModel();
public boolean ScanForSpywares = false;
public HomeScreen() {
setResizable(false);
setTitle("Spyware Interface");
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(100, 100, 699, 399);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblFrtzfoxy = new JLabel("FrtzFoxy");
lblFrtzfoxy.setForeground(new Color(30, 144, 255));
lblFrtzfoxy.setFont(new Font("Tahoma", Font.PLAIN, 39));
lblFrtzfoxy.setBounds(10, 11, 168, 41);
contentPane.add(lblFrtzfoxy);
JLabel lblCyberIntelligence = new JLabel("Cyber Intelligence Corporation");
lblCyberIntelligence.setForeground(new Color(0, 0, 255));
lblCyberIntelligence.setFont(new Font("Tahoma", Font.PLAIN, 10));
lblCyberIntelligence.setBounds(12, 47, 141, 14);
contentPane.add(lblCyberIntelligence);
ScrollPane scrollPane = new ScrollPane();
scrollPane.setBounds(10, 67, 143, 263);
contentPane.add(scrollPane);
list = new JList(model);
scrollPane.add(list);
list.setBounds(329, 223, 1, 1);
JLabel lblActiveNan = new JLabel("Active: NaN");
lblActiveNan.setFont(new Font("Roboto Cn", Font.BOLD, 22));
lblActiveNan.setBounds(10, 330, 143, 34);
contentPane.add(lblActiveNan);
JButton btnScan = new JButton("Scan");
btnScan.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
ScanForSpywares=true;
}
});
btnScan.setBounds(604, 0, 89, 23);
contentPane.add(btnScan);
}}
这里有一些奇怪的事情,所有这些都是可能的原因 首先确保,
sc
实际上是主屏幕的同一个实例(在给出的代码片段中不清楚)。其次,将布尔值声明为volatile,以确保第二个线程看到来自主/UI线程的更改。但是,您应该阅读更多关于volatile
的内容,因为它经常被误用
最后但并非最不重要的一点:由于您的代码以静默方式捕获所有异常,因此您不会注意到任何事情(例如,serv.LoadMYSQLSettings();
)是否出错。尝试使ScanForSpywaresvolatile
。哈哈,是的,这是一个异常(java.lang.ArrayIndexOutOfBoundsException),我完全忘记了!谢谢你的帮助:“)。我也会尝试让它变得不稳定,了解一些新的东西很好。