-3

いくつかのクラスと 1 つのメイン メソッドがあります。このプログラムは、Access データベースに接続して情報を取得するために使用されます。

1 つのボックスで (結果を表示するために) GUI のみを処理するクラスがあり JTextArea ます。別のクラスが 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");

基本的に私の質問はString line、GUI クラスからにアクセスして、GUI にメイン メソッドがないことを念頭に置いてtxtArea.setText表示する方法です。line

編集:

これを回避するために、パラメーターとして受け取る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 クラスは次のとおりです。 public class LineObject

{
    protected String line;


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


    public String getLine()
    {
        return line;
    }

}
4

3 に答える 3

1

データベース アクセス コードは別のスレッドで実行されると仮定します。そうしないと、通常のレイテンシによってイベント ディスパッチ スレッド(EDT) がブロックされます。JTextAreayour への参照をパラメーターとしてデータベース コードに渡します。JTextAreaリファレンスを使用して EDTを更新します。

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

関連する例がここに見られます。

于 2013-09-18T21:27:52.523 に答える
0

クラス ( whilelineループを実行するもの) のプライベート クラス フィールドを作成します。

public LoopingClass {
  private String line;

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

次に、この変数へのパブリック ゲッターを作成します。

public LoopingClass {
  private String line;

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

  public String getLine() {
    return line;
  }
}

次に、GUI から、オブジェクト インスタンスのゲッターを呼び出します。

// somewhere in your GUI class
loopingClassInstance.getLine();
于 2013-09-18T19:08:12.713 に答える