هنا أقوم بكتابة code يعرض بيانات من قاعدة بينات إلى Jtable
بيظهر nullPointerexception مش عارف ايه سببه فى السطر هذا
metaData = resultSet.getMetaData();
أنا بخمن عشان ان ال resultset ليس لها Intialization لكن فوق السطر هذا يوجد دالة setQuery() و بها intialization لل resultset إذن ما العيب ؟؟
----------------------------------------------------------------------------------------------------
الكود
------------
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class TestJtable extends JFrame {
private JPanel mainPanel, buttonPanel;
private JButton[] buttons;
private final String[] BUTTONNAMES = {"showButton", "insertButton", "searchButton", "updateButton", "deletebutton"};
private JInternalFrame internalFrame;
private JDesktopPane desktopPane;
private JTable table;
private ResultTableModel tableModel;
private JScrollPane scrollPane;
private static final String showData = "SELECT * FROM Employee";
private MyActionListener myActionListener;
public TestJtable() throws ClassNotFoundException, SQLException {
intializingPanels();
intializingbuttons();
tableModel = new ResultTableModel();
table = new JTable(tableModel);
tableModelOperations();
scrollPane = new JScrollPane(table, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
getContentPane().add(mainPanel);
}
public static void main(String[] args) throws SQLException, ClassNotFoundException {
TestJtable testJtable = new TestJtable();
testJtable.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
testJtable.setSize(new Dimension(600, 300));
testJtable.setLocationRelativeTo(null);
testJtable.setVisible(true);
}
private void intializingPanels() {
mainPanel = new JPanel(new BorderLayout());
buttonPanel = new JPanel(new FlowLayout());
}
private void intializingbuttons() {
myActionListener = new MyActionListener();
buttons = new JButton[BUTTONNAMES.length];
for (int i = 0; i < BUTTONNAMES.length; i++) {
buttons = new JButton(BUTTONNAMES);
buttons.addActionListener(myActionListener);
buttonPanel.add(buttons);
mainPanel.add(buttonPanel, BorderLayout.NORTH);
}
}
private void intializingInternalDeskTop() {
JPanel panel = new JPanel(new BorderLayout());
panel.add(scrollPane, BorderLayout.CENTER);
/////////////////////////////////////////////////////////////
internalFrame = new JInternalFrame(null, true, true, true);
internalFrame.setSize(500, 500);
internalFrame.add(panel);
try {
internalFrame.setMaximum(true);
} catch (PropertyVetoException ex) {
ex.printStackTrace();
}
//////////////////////////////////////////////////////////////
desktopPane = new JDesktopPane();
desktopPane.setOpaque(false);
desktopPane.setEnabled(true);
desktopPane.add(internalFrame);
internalFrame.setVisible(true);
//////////////////////////////////////////////////////////////
mainPanel.add(desktopPane, BorderLayout.CENTER);
}
private void tableModelOperations() throws SQLException {
tableModel.setQuery(showData);
tableModel.disconnectedDatabase();
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableModel);
table.setRowSorter(sorter);
}
private class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == buttons[0]) {
intializingInternalDeskTop();
}
}
}
}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.table.AbstractTableModel;
public class ResultTableModel extends AbstractTableModel {
private static final String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
private static final String DRIVER_URL = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};" +
"Dbq=D:\\my _works\\my_works_2010\\JDBC-work\\employeedb\\Database2.mdb";
private Connection connection;
private Statement statement;
private ResultSet resultSet;
private ResultSetMetaData metaData;
private String query;
private int numOfRow;
private boolean connect = false;
public ResultTableModel() throws ClassNotFoundException, SQLException {
Class.forName(DRIVER);
connection = DriverManager.getConnection(DRIVER_URL);
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
connect = true;
if (query != null) {
setQuery(query);
}
metaData = resultSet.getMetaData();
}
@Override
public Class getColumnClass(int columnIndex) {
try {
String className = metaData.getColumnClassName(columnIndex + 1);
return Class.forName(className);
} catch (Exception ex) {
ex.printStackTrace();
}
return Object.class;
}
@Override
public int getColumnCount() {
try {
return metaData.getColumnCount();
} catch (SQLException ex) {
ex.printStackTrace();
}
return 0;
}
@Override
public String getColumnName(int column) {
try {
return metaData.getColumnName(column + 1);
} catch (SQLException ex) {
ex.printStackTrace();
}
return "";
}
public int getRowCount() {
return numOfRow;
}
public Object getValueAt(int rowIndex, int columnIndex) {
try {
resultSet.absolute(rowIndex + 1);
return resultSet.getObject(columnIndex + 1);
} catch (SQLException ex) {
ex.printStackTrace();
}
return "";
}
public void setQuery(String query) throws SQLException {
resultSet = statement.executeQuery(query);
metaData = resultSet.getMetaData();
resultSet.last();
numOfRow = resultSet.getRow();
fireTableStructureChanged();
}
public void disconnectedDatabase() throws SQLException {
if (connect) {
resultSet.close();
statement.close();
connection.close();
}
}
}و هل هذه الطريقة لعرض بيانا فى JTabel سليمة .؟؟؟ لو أحد عنده طريقة أفضل يعرضها
شكراً
