2012-11-29 115 views
-1

所以我的程序由两个类组成 1.我的主要类处理GUI扩展了JFrame,所以我需要实例化它来配置我的JFrame。 2. MyClass使用API​​来请求和处理从服务器请求的数据,该API必须具有处理请求的API类的实例。 (它是一个可运行的类,并实现API封装)从另一个类实例(调用方法)获取一个类实例

因此,如果我简单地实例类MyClass(Runnable Processor = new MyClass()),在我的主类中创建一个线程并运行。我不能访问MyClass或API类方法的方法(我特别感兴趣的是连接杀手方法)。我试图访问它像Processor.API.eDisconnect()。那不起作用。

但是,如果这样做:创建一个MyClass的Arraylist,然后添加一个MyClass的实例到列表中。创建一个线程,如Thread myThread = new Thread(List.get(0))。我可以访问我的API类的方法,如List.get(0).API.eDisconnect()。

那么,为什么第二种方法的工作?唯一的区别是类实例是一个独立变量或者在一个列表中。

是否正确实践会发生什么问题?有没有更好的方法来做到这一点?

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package basket; 

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JButton; 
import javax.swing.JFrame; 

/** 
* 
* @author ivan 
*/ 
public class Basket extends JFrame implements ActionListener{ 
    protected List<TwsHandler> TWS = new ArrayList<>(); 
    public static void main(String[] args) 
    { 
     Basket main = new Basket(); 
     main.Launch(); 
    } 
    public void Launch() 
    { 
     TWS.add(new TwsHandler()); 
     BorderLayout MainLayout = new BorderLayout(); 
     JButton Start = new JButton("Start"); 
     Start.addActionListener(this); 
     Start.setActionCommand("Start"); 
     JButton Stop = new JButton("Stop"); 
     Stop.addActionListener(this); 
     Stop.setActionCommand("Stop"); 
     this.setLayout(MainLayout); 
     this.add(Start , BorderLayout.SOUTH); 
     this.add(Stop , BorderLayout.WEST); 
     this.addWindowListener(new WindowAdapter() 
     { 
      @Override 
      public void windowClosing(WindowEvent e){System.exit(0);} 
     }); 
     this.setTitle("Option basket robot"); 
     this.setBounds(100, 100, 800, 600); 
     this.setVisible(true); 

    } 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     switch (e.getActionCommand()) { 
      case "Start": 
       Thread Processor = new Thread(TWS.get(0)); 
       Processor.start(); 
       break; 
      case "Stop": 
       System.out.println(TWS.get(0).Eclient.isConnected()); 
       break; 

     } 
    } 
} 
+3

显示'main'的代码。 – bellum

+0

你能告诉我们什么不起作用,并解释你的意思吗? –

+0

请学习Java命名约定,并遵守它们。变量以小写字母开头。 –

回答

1

唯一的区别是,在第一种情况下,如果引用一个MyClass实例作为Runnable,而在第二种情况下,如果引用它作为一个MyClass(通过ArrayList,其没有按”没有任何用途)。

而不是

Runnable processor = new MyClass(); 

使用

MyClass processor = new MyClass(); 

,因为你希望能够调用MyClass方法。

+0

谢谢,我从来没有想过会改变这么多。 – user1633277

相关问题