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的模型?”-这是我一直在玩的游戏,看看是否可以让它正常工作