Java 将数据库数据输出到JTable
我一直在努力遵循信息和代码,但我遇到了一些困难 数据库查询工作正常,我已成功地将其输出到控制台。根据以上指南,我添加了一些代码,将结果集数据放入所需的向量中。这是我的代码:Java 将数据库数据输出到JTable,java,swing,jtable,Java,Swing,Jtable,我一直在努力遵循信息和代码,但我遇到了一些困难 数据库查询工作正常,我已成功地将其输出到控制台。根据以上指南,我添加了一些代码,将结果集数据放入所需的向量中。这是我的代码: public class Reports extends JFrame { /** * */ private static final long serialVersionUID = 1L; private JPanel contentPane; private JTe
public class Reports extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JTextField dateFromYYYY;
private JTextField dateFromMM;
private JTextField dateFromDD;
private JTextField dateToYYYY;
private JTextField dateToMM;
private JTextField dateToDD;
private JTextField ownerNameInput;
private JTextField petNameInput;
private JTextField doctorNameInput;
private JCheckBox isPaid = new JCheckBox("Is Paid");
public static JTable table;
public static boolean printTable = true;
private String printHeader;
// Static Variables
private final static String BOOKINGS_TABLES = "FROM Doctor, Pet, Treatment, Visit ";
/**
* Create the frame.
*/
private void SearchFrame() {
setTitle("Generate a Report");
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
setBounds(100, 100, 981, 551);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblWhatWouldYou = new JLabel("What would you like a report for?");
lblWhatWouldYou.setBounds(36, 10, 200, 50);
contentPane.add(lblWhatWouldYou);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(260, 60, 690, 370);
contentPane.add(scrollPane);
table = new JTable();
scrollPane.setViewportView(table);
}
private void DateFields(){
// From Date
//Year
JLabel lblFromDate = new JLabel("From dd:");
lblFromDate.setBounds(20, 180, 165, 25);
contentPane.add(lblFromDate);
JLabel lblFromYear = new JLabel("yyyy:");
lblFromYear.setBounds(180, 180, 165, 25);
contentPane.add(lblFromYear);
dateFromYYYY = new JTextField();
dateFromYYYY.setBounds(210, 180, 40, 25);
contentPane.add(dateFromYYYY);
//Month
JLabel lblFromMonth = new JLabel("mm:");
lblFromMonth.setBounds(128, 180, 165, 25);
contentPane.add(lblFromMonth);
dateFromMM = new JTextField();
dateFromMM.setBounds(155, 180, 20, 25);
contentPane.add(dateFromMM);
dateFromDD = new JTextField();
dateFromDD.setBounds(100, 180, 20, 25);
contentPane.add(dateFromDD);
// To Date
//Year
JLabel lblToDate = new JLabel("To dd:");
lblToDate.setBounds(20, 210, 165, 25);
contentPane.add(lblToDate);
JLabel lblToYear = new JLabel("yyyy:");
lblToYear.setBounds(180, 210, 165, 25);
contentPane.add(lblToYear);
dateToYYYY = new JTextField();
dateToYYYY.setBounds(210, 210, 40, 25);
contentPane.add(dateToYYYY);
//Month
JLabel lblToMonth = new JLabel("mm:");
lblToMonth.setBounds(128, 210, 165, 25);
contentPane.add(lblToMonth);
dateToMM = new JTextField();
dateToMM.setBounds(155, 210, 20, 25);
contentPane.add(dateToMM);
dateToDD = new JTextField();
dateToDD.setBounds(100, 210, 20, 25);
contentPane.add(dateToDD);
}
private void PetName(){
JLabel lblPetName = new JLabel("Pet Name:");
lblPetName.setBounds(20, 90, 165, 25);
contentPane.add(lblPetName);
petNameInput = new JTextField();
petNameInput.setBounds(100, 90, 150, 25);
contentPane.add(petNameInput);
}
private void OwnerName(){
JLabel lblOwnerName = new JLabel("Owner Name:");
lblOwnerName.setBounds(20, 120, 165, 25);
contentPane.add(lblOwnerName);
ownerNameInput = new JTextField();
ownerNameInput.setBounds(100, 120, 150, 25);
contentPane.add(ownerNameInput);
}
private void DoctorName(){
JLabel lblDoctorName = new JLabel("Doctor Name:");
lblDoctorName.setBounds(20, 150, 165, 25);
contentPane.add(lblDoctorName);
doctorNameInput = new JTextField();
doctorNameInput.setBounds(100, 150, 150, 25);
contentPane.add(doctorNameInput);
}
private void IsPaidCheckBox(){
isPaid.setBounds(155, 250, 97, 25);
contentPane.add(isPaid);
}
public void Bookings() {
// Local variables
Vector<Object> columnNames = new Vector<Object>();
Vector<Object> data = new Vector<Object>();
// Instantiate the frame
SearchFrame();
// Set search fields
PetName();
OwnerName();
DoctorName();
IsPaidCheckBox();
DateFields();
JButton btnSearch = new JButton("Search");
btnSearch.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
String queryString00 = "";
String queryString01 = "SELECT pet.petname AS [Pet Name], pet.ownerName AS [Owner Name], doctor.doctorName AS [Doctor Name], visit.visitDate AS [Visit Date], treatment.treatmentName AS [Treatment Name], visit.ispaid AS [Is Paid] ";
String queryString03 = "WHERE Visit.petID = Pet.petID ";
String queryString02 = " GROUP BY visitID;";
// build the query
if(!(petNameInput.getText().equals("")))
queryString00 = queryString01 + BOOKINGS_TABLES + queryString03 + "AND petname LIKE " + "'%" + petNameInput.getText() + "%'";
else queryString00 = queryString01 + BOOKINGS_TABLES + queryString03;
if(!(ownerNameInput.getText().equals("")))
queryString00 = queryString00 + "AND ownername LIKE " + "'%" + ownerNameInput.getText() + "%'";
if(!(doctorNameInput.getText().equals("")))
queryString00 = queryString00 + "AND doctorname LIKE " + "'%" + doctorNameInput.getText() + "%'";
if(!(dateFromYYYY.getText().equals(""))){
String fromString = dateFromYYYY.getText() + "-" + dateFromMM.getText() + "-" + dateFromDD.getText();
queryString00 = queryString00 + " AND visitdate >= '" + fromString + "'";
}
if(!(dateToYYYY.getText().equals(""))){
String toString = dateToYYYY.getText() + "-" + dateToMM.getText() + "-" + dateToDD.getText();
queryString00 = queryString00 + " AND visitdate <= '" + toString + "'";
}
if(isPaid.isSelected())
queryString00 = queryString00 + " AND ispaid = 'Y'";
queryString00 = queryString00 + queryString02;
// System.out.println(queryString00);
DatabaseConnection db = new DatabaseConnection();
db.openConn();
// Get query
ResultSet rs = db.getSearch(queryString00);
ResultSetMetaData md = null;
// Set up vectors for table output
// Output query to screen (Much of the following code is adapted from http://www.camick.com/java/source/TableFromDatabase.java)
try{
md = rs.getMetaData();
int columnCount = md.getColumnCount();
// Get column names
for(int i = 1; i <= columnCount; i++)
columnNames.addElement(md.getColumnName(i));
while(rs.next()){
// System.out.printf("%-15s%-15s%-15s%-15s%-15s%-15s\n", rs.getString("Pet Name"), rs.getString("Owner Name"), rs.getString("Doctor Name"), rs.getString("Visit Date"), rs.getString("Treatment Name"), rs.getString("Is Paid"));
Vector<Object> row = new Vector<Object>(columnCount);
for(int i = 1; i <= columnCount; i++)
row.addElement(rs.getObject(i));
data.addElement(row);
}
}
catch (SQLException e) {
e.printStackTrace();
}
db.closeConn();
}
// Create table with database data
DefaultTableModel model = new DefaultTableModel(data, columnNames)
{
/**
*
*/
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
@Override
public Class getColumnClass(int column)
{
for (int row = 0; row < getRowCount(); row++)
{
Object o = getValueAt(row, column);
if (o != null)
{
return o.getClass();
}
}
return Object.class;
}
};
// Out put to the table (theoretically)
JTable table = new JTable(columnNames, data);
this.scrollPane.setViewportView(table);
// JScrollPane scrollPane = new JScrollPane( table );
// getContentPane().add( scrollPane );
});
btnSearch.setBounds(36, 460, 165, 25);
contentPane.add(btnSearch);
JLabel resultLabel = new JLabel("Reports will be printed below");
resultLabel.setBounds(515, 10, 312, 50);
contentPane.add(resultLabel);
JButton printReport = new JButton("Print Report");
printReport.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
String resultLabelPrint = resultLabel.getText();
MessageFormat footer = new MessageFormat(resultLabelPrint);
MessageFormat header = new MessageFormat(printHeader);
boolean complete =table.print(JTable.PrintMode.FIT_WIDTH, header , footer );
if (complete) {
/* show a success message */
} else {
/*show a message indicating that printing was cancelled */
}
} catch (PrinterException pe) {
/* Printing failed, report to the user */
}
}
});
printReport.setBounds(473, 460, 227, 25);
contentPane.add(printReport);
}
}
第一行给出了分号(;)上的语法错误,特别是标记“;”上的语法错误,无效的AssignmentOperator。我在尝试“model”变量时得到了相同的结果
当我取消对最后两行的注释时,我得到“Syntax error on token”。{expected'并且Eclipse要求另一个结束{尽管没有相应的开始}。如果我添加它,那么我会得到更多错误
我怀疑这与我试图遵循的代码的类结构有关,但我也没有运气遵循这些
我所要做的就是获取我所拥有的信息并将其输出到已经存在的表中。我如何做到这一点?
scrollPane
不是全局实例
将JScrollPane scrollPane
移出方法SearchFrame()
并将其放入类的实例变量列表中
这只是您当前的第一个问题,另一个问题是您正在尝试访问报告中定义的实例变量,该变量位于2x嵌套匿名类的范围内
您应该将GUI方法参数化,以接受要注入面板的组件
public class Reports extends JFrame {
JScrollPane scrollPane;
...
private void SearchFrame() {
scrollPane = new JScrollPane ();
}
...
public void Bookings() {
scrollPane...
...
}
...
}
滚动窗格
不是全局实例
将JScrollPane scrollPane
移出方法SearchFrame()
并将其放入类的实例变量列表中
这只是您当前的第一个问题,另一个问题是您正在尝试访问报告中定义的实例变量,该变量位于2x嵌套匿名类的范围内
您应该将GUI方法参数化,以接受要注入面板的组件
public class Reports extends JFrame {
JScrollPane scrollPane;
...
private void SearchFrame() {
scrollPane = new JScrollPane ();
}
...
public void Bookings() {
scrollPane...
...
}
...
}
您没有显示所有错误消息,也没有显示完整的错误消息(请解决此问题)。最重要的是,不能引用封闭范围内定义的非最终局部变量数据。因此,将变量设置为最终变量--解决了一个问题
public void Bookings() {
// Local variables
final Vector<Object> columnNames = new Vector<Object>(); //!! made final
final Vector<Object> data = new Vector<Object>();
正在任何和所有方法之外调用。您需要仔细匹配花括号
但让我对您的代码感到困惑的问题是——为什么要创建一个TableModel而不将其用作JTable的模型?您没有显示所有错误消息,也没有显示完整的错误消息(请修复此问题)。最重要的是,不能引用在封闭范围
消息中定义的非最终局部变量数据。因此,将变量设为最终变量—解决了一个问题
public void Bookings() {
// Local variables
final Vector<Object> columnNames = new Vector<Object>(); //!! made final
final Vector<Object> data = new Vector<Object>();
正在任何和所有方法之外调用。您需要仔细匹配花括号
然而,让我对您的代码感到困惑的问题是——为什么要创建一个TableModel而不将其用作JTable的模型?滚动窗格
不是一个全局实例。避免使用null
布局,像素完美的布局在现代ui设计中是一种错觉。有太多的因素会影响组件的单个大小s、 这些都是您无法控制的。Swing的设计初衷是与布局管理器一起工作,丢弃它们将导致无休止的问题,您将花费越来越多的时间试图解决这些问题,而不是重新创建JTable
或JScrollPane
。创建它们并将它们添加到您的UI中,创建的实例字段de>JTable
,这样您就可以从类中引用。查询数据库并将新数据添加到新的TableModel
,完成此操作后,将表模型应用到JTable
的实例中……仔细查看和。您可能希望进行通读,这将使人们更容易阅读您的代码d供您阅读“查询数据库并将新数据添加到新的TableModel,完成此操作后,将表模型应用于JTable的实例…”如何做到这一点?scrollPane
不是一个全局实例。避免使用null
布局,像素完美的布局在现代ui设计中是一种幻觉。有太多的因素会影响组件的单个大小,而这些都是您无法控制的。Swing设计的核心是布局管理器,di删除这些内容将导致问题层出不穷,您将花费越来越多的时间试图纠正这些问题。不要重新创建JTable
或JScrollPane
。创建这些内容并将其添加到您的UI中,创建JTable
的实例字段,以便您可以从类中引用。查询数据库并添加新内容将数据添加到新的TableModel
,完成此操作后,将表模型应用到JTable
…仔细查看和。您可能希望通读,这将使人们更容易阅读您的代码,您也更容易阅读他人的代码“查询数据库并将新数据添加到新的TableModel中,完成此操作后,将table模型应用于JTable的实例。”。。"我该怎么做呢?更好的是,将JTable
作为实例字段,将其添加到JScrollPane
的实例中,将JScrollPane
添加到框架中,然后根据需要简单地更改表模型是的,这也是我的想法。更好的是,将JTable
作为实例字段,将其添加到实例中在JScrollPane
中,将JScrollPane
添加到框架中,然后根据需要简单地更改表模型是的,这也是我的想法。“为什么要创建一个表模型,而不将其用作JTable的模型?”-这是我一直在玩的游戏,看看是否可以让它正常工作