从另一个类访问对象

时间:2013-09-18 18:59:48

标签: java string swing class jtextarea

我有一些课程和一个主要方法。该程序用于连接Access数据库并检索信息。

我有一个只在一个JTextArea框中处理GUI(显示结果)的类。另一个类运行while循环并从数据库中提取数据并将其分配给String:

line = (line+upid+"\t"+StreetNum+"\t"+suburb+"\t"+area+"\t"+price+"\t"+agentID+"\t"+numBeds+"\t"+numBaths+"\t"+spool+"\t"+numGarages+"\t"+date+"\t"+ownerID+"\t"+SaleOrRent+"\n");

基本上我的问题是如何从GUI类访问String line以便我可以使用txtArea.setText来显示line,同时考虑到GUI没有主要方法?

编辑:

为了解决这个问题,我创建了一个LineObject,其中line作为参数。然后我从getLine调用void addComponents,但它给出了nullPointerException?

这是searchProps类:

import java.awt.Container;
import java.sql.*;
import java.util.*;
import javax.swing.*;


public class searchProps 
{
    protected String price, area, query, suburb, date, SaleOrRent, strQuery, out, line="";
    protected int agentID, upid, StreetNum, numBeds, numBaths, numGarages, ownerID, size;
    protected boolean spool;
    PropertyObject PropertyArray[] = new PropertyObject[3];
    LineObject obj;
    JFrame jf;  
    JTextArea txtArea = new JTextArea();
     {
        initialFrame();
        addComponents();
    }

public searchProps(int propID) //search using UPID only
   {
       try 
               {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection conn = DriverManager.getConnection("jdbc:odbc:PropertyOracleDatabase");
            Statement s = conn.createStatement();



            query = ("SELECT * FROM Properties WHERE UPID = "+propID);

            // Fetch table
            s.execute(query);
            ResultSet rs = s.getResultSet();
            while((rs!=null) && (rs.next()))
            {
                upid=rs.getInt(1);
                StreetNum=rs.getInt(2);
                suburb=rs.getString(3);
                area=rs.getString(4);
                price=rs.getString(5);
                agentID= rs.getInt(6);
                numBeds=rs.getInt(7);
                numBaths=rs.getInt(8);
                spool=rs.getBoolean(9);
                numGarages=rs.getInt(10);
                date=rs.getString(11);
                ownerID=rs.getInt(12);
                SaleOrRent=rs.getString(13);
                size++;


              line = (line+upid+"\t"+StreetNum+"\t"+suburb+"\t"+area+"\t"+price+"\t"+agentID+"\t"+numBeds+"\t"+numBaths+"\t"+spool+"\t"+numGarages+"\t"+date+"\t"+ownerID+"\t"+SaleOrRent+"\n");
              obj= new LineObject(line);
              System.out.println(line);
              String out = obj.getLine();
              System.out.println(out);
            }



            // close and cleanup
            s.close();
            conn.close();
               }

        catch(Exception ex)
        {
            ex.printStackTrace();
        }



   }
    void initialFrame()
    {
        jf=new JFrame();
        jf.setSize (1300,700);
        jf.setTitle("Property Oracle | Results Page");
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

     void addComponents()
     {

         Container con = jf.getContentPane();
         con.setLayout(null);
         txtArea.setBounds(20,30,1200,600);
         con.add(txtArea);
         txtArea.setText("UPID\tStreetNum\tSuburb\tArea\tPrice\tAgentID\tBedrooms\tBathrooms\tSwimming Pool\tGarages\tDate\tOwner\tSale/Rent\n");
         out = obj.getLine();
         System.out.println(out);



     }

}

这是LineObject类: 公共类LineObject

{
    protected String line;


    public LineObject(String a)
    {
        line = a;
    }


    public String getLine()
    {
        return line;
    }

}

3 个答案:

答案 0 :(得分:1)

我假设您的数据库访问代码在单独的线程中运行,否则典型的延迟会阻止event dispatch thread(EDT)。将对JTextArea的引用作为参数传递给数据库代码。使用该引用更新EDT上的JTextArea

final String line = …
EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        ta.append(line);
    }
});

可以看到相关示例here

答案 1 :(得分:0)

使line成为类的私有类字段(运行while循环的字段)。

public LoopingClass {
  private String line;

  public void loopMethod() {
    line = //...
  }
}

然后为此变量创建一个公共getter。

public LoopingClass {
  private String line;

  public void loopMethod() {
    line = //...
  }

  public String getLine() {
    return line;
  }
}

然后从GUI中调用对象实例的getter。

// somewhere in your GUI class
loopingClassInstance.getLine();

答案 2 :(得分:0)

看一下MVC pattern:从前端(GUI)解耦业务逻辑(将数据放入数据库并构建字符串“line”)总是好的做法。

顺便说一下,由于您通过向其添加更多数据来构建字符串,因此您应该考虑使用StringBuilder代替:

StringBuilder lineBuilder = new StringBuilder();

// append data:
lineBuilder.append(someString);

// create a string only when you need it:
String line = lineBuilder.toString();

通过这种方式,您不会连续创建新字符串(从长远来看这可能很昂贵,尤其是在字符串不断增长的情况下),但是使用StringBuilder提供的缓冲区然后仅在创建实际字符串时您需要它,例如,当您需要更新JTextArea