Java Swing从数据库获取数据错误

Java Swing从数据库获取数据错误,java,sql,swing,postgresql,Java,Sql,Swing,Postgresql,我不能让它工作。。。如何从抽象模型内的数据库中获取数据?我真的需要帮助,谢谢。。我尝试了不同的解决方案,但没有成功。。。有人能帮我吗谢谢。。。即使只是上帝保佑 import java.awt.Dimension; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLExc

我不能让它工作。。。如何从抽象模型内的数据库中获取数据?我真的需要帮助,谢谢。。我尝试了不同的解决方案,但没有成功。。。有人能帮我吗谢谢。。。即使只是上帝保佑

import java.awt.Dimension;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.SpringLayout;
import javax.swing.SwingConstants;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableRowSorter;

public class ConsolidateInvoices extends JPanel {

    private JTable table;
    private JTextField Name;
    private JTextField BusinessPartner;
    private TableRowSorter<Model> sorter;
    private String[] columnNames;
    private Object[][] data;

    public ConsolidateInvoices() {

        JPanel form = new JPanel(new SpringLayout());

        JLabel lblName = new JLabel("Name:", SwingConstants.TRAILING);
        form.add(lblName);
        Name = new JTextField();
        form.add(Name);
        JLabel lblBusinessPartner = new JLabel("Business Partner:",
                SwingConstants.TRAILING);
        form.add(lblBusinessPartner);
        BusinessPartner = new JTextField();

        // Whenever filterText changes do the filter method
        BusinessPartner.getDocument().addDocumentListener(
                new DocumentListener() {
                    public void changedUpdate(DocumentEvent e) {
                        newFilter();
                    }

                    public void insertUpdate(DocumentEvent e) {
                        newFilter();
                    }

                    public void removeUpdate(DocumentEvent e) {
                        newFilter();
                    }
                });

        lblBusinessPartner.setLabelFor(BusinessPartner);
        form.add(BusinessPartner);
        SpringUtilities.makeCompactGrid(form, 2, 2, 6, 6, 6, 6);
        add(form);

        try {

            Class.forName("org.postgresql.Driver");
            Connection connection = null;
            connection = DriverManager.getConnection(
                    "jdbc:postgresql://127.0.0.1:5432/adempiere2",
                    "postgres", "postgres");

            // Read data from a table
            String query = "Select c_invoice_id, documentno  "
                    + "from adempiere.c_invoice";
            Statement stmt = connection.createStatement();
            ResultSet rst = stmt.executeQuery(query);
            ResultSetMetaData md = rst.getMetaData();
            int columns = md.getColumnCount();
            int rows = 1;

            //new Boolean(false)

            columnNames = new String[columns];
            // Get column names
            for (int i = 1; i <= columns; i++) {
                columnNames[i-1] = md.getColumnName(i);
            }

            System.out.println(rows);

            data = new Object[rows][columns];
            // Get row data
            while (rst.next()) {
                int ctr = 0;
                for (int i = 1; i <= columns; i++) {
                    data[ctr][i-1] = rst.getObject(i);
                }
                ctr++;
            }

            rst.close();
            stmt.close();
            connection.close();

        } catch (SQLException e) {

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        // Create a separate panel for the table
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        table = new JTable(new Model());
        // Sorter
        Model model = new Model();
        sorter = new TableRowSorter<Model>(model);
        table.setRowSorter(sorter);
        table.setPreferredScrollableViewportSize(new Dimension(700, 700));
        table.setFillsViewportHeight(true);

        // To make the selection single
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        // To create the scroll panel
        JScrollPane scrollPane = new JScrollPane(table);
        // initColumnSizes(table);
        // setUpSportColumn(table, table.getColumnModel().getColumn(2));
        add(scrollPane);
    }

    // The filter method used for the business partner
    private void newFilter() {
        RowFilter<Model, Object> rf = null;
        // If current text doesn't parse, don't update.
        try {
            rf = RowFilter.regexFilter(BusinessPartner.getText(), 0);
        } catch (java.util.regex.PatternSyntaxException e) {
            return;
        }
        sorter.setRowFilter(rf);
    }

    class Model extends AbstractTableModel {

        public int getColumnCount() {
            return columnNames.length;
        }

        public int getRowCount() {
            return data.length;
        }

        public String getColumnName(int col) {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col) {
            return data[row][col];
        }

        // To make the column a check box
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        public boolean isCellEditable(int row, int col) {
            return false;
        }

        public void setValueAt(Object value, int row, int col) {
            data[row][col] = value;
            fireTableCellUpdated(row, col);
        }

    }

    private static void showWindow() {
        // Create and set up the window.
        JFrame frame = new JFrame("Table");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Create and set up the content pane.
        ConsolidateInvoices newContentPane = new ConsolidateInvoices();
        newContentPane.setOpaque(true); // content panes must be opaque
        frame.setContentPane(newContentPane);
        // Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                showWindow();
            }
        });
    }

}
导入java.awt.Dimension;
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.ResultSet;
导入java.sql.ResultSetMetaData;
导入java.sql.SQLException;
导入java.sql.Statement;
导入javax.swing.BoxLayout;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.JTextField;
导入javax.swing.ListSelectionModel;
导入javax.swing.RowFilter;
导入javax.swing.SpringLayout;
导入javax.swing.SwingConstants;
导入javax.swing.event.DocumentEvent;
导入javax.swing.event.DocumentListener;
导入javax.swing.table.AbstractTableModel;
导入javax.swing.table.TableRowSorter;
公共类合并文件扩展JPanel{
专用JTable表;
私有JTextField名称;
私人JTextField业务伙伴;
私人桌面分拣机;
私有字符串[]列名称;
私有对象[][]数据;
公共合并通知(){
JPanel form=newjpanel(newspringlayout());
JLabel lblName=新的JLabel(“名称:”,SwingConstants.TRAILING);
添加表格(lblName);
Name=新的JTextField();
表格.加入(姓名);
JLabel lblBusinessPartner=新的JLabel(“业务合作伙伴:”,
SwingConstants.training);
表格.添加(LBL业务合作伙伴);
业务伙伴=新的JTextField();
//每当filterText发生更改时,请执行filter方法
BusinessPartner.getDocument().addDocumentListener(
新建DocumentListener(){
公共作废更改日期(记录事件e){
newFilter();
}
公共作废插入更新(文档事件e){
newFilter();
}
公共作废移除更新(文档事件e){
newFilter();
}
});
lblBusinessPartner.setLabelFor(业务伙伴);
添加表格(业务伙伴);
makeCompactGrid(表单,2,2,6,6,6,6);
添加(表格);
试一试{
Class.forName(“org.postgresql.Driver”);
连接=空;
connection=DriverManager.getConnection(
“jdbc:postgresql://127.0.0.1:5432/adempiere2",
“博士后”、“博士后”);
//从表中读取数据
String query=“选择c\U发票\U id,单据号”
+“来自adempiere.c_发票”;
语句stmt=connection.createStatement();
ResultSet rst=stmt.executeQuery(查询);
ResultSetMetaData md=rst.getMetaData();
int columns=md.getColumnCount();
int行=1;
//新布尔值(false)
columnNames=新字符串[列];
//获取列名

对于(int i=1;i我想问题在这里:

    table = new JTable(new Model());
    // Sorter
    Model model = new Model();
    sorter = new TableRowSorter<Model>(model);
    table.setRowSorter(sorter);
并将
fireTableCellUpdated(行,列);
(在setValueAt()中)替换为:

如果你看一下,我们可以看到一条有趣的评论:

        // Normally, one should call fireTableCellUpdated() when
        // a value is changed.  However, doing so in this demo
        // causes a problem with TableSorter.  The tableChanged()
        // call on TableSorter that results from calling
        // fireTableCellUpdated() causes the indices to be regenerated
        // when they shouldn't be.  Ideally, TableSorter should be
        // given a more intelligent tableChanged() implementation,
        // and then the following line can be uncommented.
        // fireTableCellUpdated(row, col);

虽然您没有说明问题是什么,但我已经看到了几个问题:

    table = new JTable(new Model());
    // Sorter
    Model model = new Model();
您创建了两个模型,而您应该使用同一个实例。现在您可能可以避开这个问题,因为它们共享相同的
数据

   } catch (SQLException e) {
       // Always log or print an exception
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        // If this exception occurs, the rest of the code is pretty much useless since you won't have a connection to the DB. You should rather forward this exception as an error
    }


    // To make the column a check box
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }
如果没有值,则会出现异常(ArrayIndexOutOfBounds或NullPointerException)。此信息应基于
ResultMetadataSet

    public boolean isCellEditable(int row, int col) {
        return false;
    }

    public void setValueAt(Object value, int row, int col) {
        data[row][col] = value;
        fireTableCellUpdated(row, col);
    }
如果您说您的单元格不可编辑,则无需实现setValueAt,它将永远不会被调用

你的for循环怎么了

for (int i = 1; i <= columns; i++) {
      columnNames[i-1] ...

用于(int i=1;i到底什么失败了?显示stacktrace。只显示有问题的部分,而不是整个程序。-将问题简化为一小段代码,说明您看到的错误。通常,您会通过这样做的本质自己发现问题。从
数据库中获取
数据的部分e> ,不应与
用户界面
部分混合。始终将此部分放在单独的线程中,或使用。您使用此设置阻止了EDT:(此外,在我看来,您正在使用此行
数据[row][col覆盖
数据(对象数组)
的先前值)=value;
在你的模型类中,这不是必须是类似于
data=this.data;
在模型类的构造函数中谢谢你的建议我知道代码真的很凌乱…因为我压力太大,无法再次修复它哈哈..谢谢..但是我能问一些问题吗?通过抽象集扩展的模型如何获得数据从数据库?我应该使用数组还是向量?谢谢,我有点困惑,因为这是我第一次使用jframe。。。thanks@KevinTan你在当前代码中遇到了什么问题?我看不出什么不起作用。你可以使用二维数组来存储值,这不是问题。嗨,纪尧姆…我想我能够解决它..t尽管我使用了矢量…非常感谢你的帮助:)我可能会再问一次,但你真的帮了我一把谢谢:)谢谢我要试试:)
   } catch (SQLException e) {
       // Always log or print an exception
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        // If this exception occurs, the rest of the code is pretty much useless since you won't have a connection to the DB. You should rather forward this exception as an error
    }


    // To make the column a check box
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }
    public boolean isCellEditable(int row, int col) {
        return false;
    }

    public void setValueAt(Object value, int row, int col) {
        data[row][col] = value;
        fireTableCellUpdated(row, col);
    }
for (int i = 1; i <= columns; i++) {
      columnNames[i-1] ...
for (int i = 0; i < columns; i++) {
      columnNames[i] ...