【问题标题】:Access an object from another class从另一个类访问对象
【发布时间】:2013-09-23 16:24:24
【问题描述】:

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

我有一个类只在一个JTextArea 框中处理 GUI(以显示结果)。另一个类运行while 循环并从数据库中提取数据并将其分配给一个字符串,如下所示:

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 没有 Main 方法?

编辑:

为了解决这个问题,我创建了一个LineObject,它以line 作为参数。然后我从void addComponents 调用getLine,但它给出了一个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;
    }

}

【问题讨论】:

  • 设为public 或添加访问器(getter)方法。它是静态的,还是属于 GUI 类的实例?
  • 常规方法是在其类中为line 创建一个getter() 方法。如果另一个类在同一个包中,它可以在实例化定义line的类的对象后直接访问line

标签: java string swing class jtextarea


【解决方案1】:

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

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

相关示例见here

【讨论】:

    【解决方案2】:

    看看MVC pattern:将业务逻辑(将数据放入数据库并构建字符串“line”)与前端 (GUI) 分离始终是一种很好的做法。

    顺便说一句,由于您是通过向其附加更多数据来构建字符串,因此您应该考虑改用StringBuilder

    StringBuilder lineBuilder = new StringBuilder();
    
    // append data:
    lineBuilder.append(someString);
    
    // create a string only when you need it:
    String line = lineBuilder.toString();
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 试过这个,但是,当它被调用时,它给出了一个空指针异常。事情是,我跟踪线,它肯定有数据,直到它在 void addComponents 方法中被调用。
      • 为了使整个工作正常,您必须确保使用的类已正确实例化(new LoopingClass 某处),然后您可以从调用类(GUI 类)实际访问它,那里应该在 GUI 类中的某处类似于 loop = new LoopingClass()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多