我有一些课程和一个主要方法。该程序用于连接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;
}
}
答案 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
。