Java:来自其他类的boolean不更改value / if语句不起作用

时间:2014-07-13 21:14:02

标签: java

所以我创建了一个名为" Homescreen"的类的对象。这是未定义的。单击按钮后,对象被初始化,线程开始检查布尔' ScanForSpywares'是真还是假。如果为true,则执行某项任务。默认情况下,布尔值为false,单击按钮后设置为true。

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);
}}

1 个答案:

答案 0 :(得分:1)

这里有一些奇怪的事情,所有这些都是可能的原因。

首先确保sc实际上是HomeScreen的同一个实例(从给出的片段中看不清楚)。其次,将布尔值声明为volatile,以确保第二个线程看到来自主/ UI线程的更改。但是,您应该阅读更多关于volatile的内容,通常会误用。

最后但并非最不重要:由于您的代码会静默捕获所有异常,因此您不会注意到是否有任何错误(例如serv.LoadMYSQLSettings();)出错。