Search...
FAQs
Subscribe
Pie
FAQs
Recent topics
Flagged topics
Hot topics
Best topics
Search...
Search within Swing / AWT / SWT
Search Coderanch
Advance search
Google search
Register / Login
Post Reply
Bookmark Topic
Watch Topic
New Topic
programming forums
Java
Mobile
Certification
Databases
Caching
Books
Engineering
Micro Controllers
OS
Languages
Paradigms
IDEs
Build Tools
Frameworks
Application Servers
Open Source
This Site
Careers
Other
Pie Elite
all forums
this forum made possible by our volunteer staff, including ...
Marshals:
Tim Cooke
Campbell Ritchie
paul wheaton
Ron McLeod
Devaka Cooray
Sheriffs:
Jeanne Boyarsky
Liutauras Vilda
Paul Clapham
Saloon Keepers:
Tim Holloway
Carey Brown
Piet Souris
Bartenders:
Forum:
Swing / AWT / SWT
Fill JTable from database with SwingWorker
Geoffrey Laurens
Greenhorn
Posts: 26
posted 10 years ago
Number of slices to send:
Optional 'thank-you' note:
Send
Why this code is not working/my JTable won't updated after i click the button
import java.awt.Component; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingWorker; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; public class TestTableLoad01 { static MyTableModel model; static JTable table; static ResultSet rs; JFrame frame; TableSwingWorker worker; public static void main(String[] args) { new TestTableLoad01(); } public TestTableLoad01() { try { frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); table = new JTable(model){ public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component component = super.prepareRenderer(renderer, row, column); int rendererWidth = component.getPreferredSize().width; TableColumn tableColumn = getColumnModel().getColumn(column); tableColumn.setPreferredWidth(Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth())); return component; } }; table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); table.setDefaultRenderer(Date.class, new TimeCellRenderer()); JButton btnQuery = new JButton("Query"); btnQuery.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { Connection conn = null; Statement stmt = null; conn = AS400ConnectionUtils.getConnection(); stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT * FROM XXX.TFMISNG"); ResultSetMetaData meta = rs.getMetaData(); int colCount = meta.getColumnCount(); String[] headers = new String[colCount]; for (int h = 1; h <= colCount; h++) { headers[h - 1] = meta.getColumnName(h); } model = new MyTableModel(); model.setColumnNames(headers); frame.repaint(); worker = new TableSwingWorker(model, rs); worker.execute(); } catch (Exception ex) { } } }); JPanel mainPanel = new JPanel(); mainPanel.setLayout(new GridBagLayout()); GridBagConstraints gridStatus1 = new GridBagConstraints(); gridStatus1.gridx = 0; gridStatus1.gridy = 0; gridStatus1.gridwidth = 1; gridStatus1.gridheight = 1; gridStatus1.anchor = GridBagConstraints.WEST; gridStatus1.fill = GridBagConstraints.BOTH; gridStatus1.weightx = 1.0; gridStatus1.weighty = 4.0; mainPanel.add(new JScrollPane(table), gridStatus1); gridStatus1.gridy = 1; gridStatus1.weighty = 0.3; mainPanel.add(btnQuery, gridStatus1); frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationRelativeTo(null); frame.setPreferredSize(new Dimension(400, 200)); frame.setVisible(true); } catch (Exception ex) { ex.printStackTrace(); } } public class TimeCellRenderer extends DefaultTableCellRenderer { private DateFormat df; public TimeCellRenderer() { df = new SimpleDateFormat("HH:mm:ss"); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value instanceof Date) { value = df.format(value); } super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); return this; } } public class MyTableModel extends AbstractTableModel { List<List><Object>> result = new ArrayList<List><Object>>(); private String[] columnNames; public MyTableModel() { } public void setColumnNames(String[] headers) { columnNames = headers; } @Override public Class<?> getColumnClass(int columnIndex) { return columnIndex == 0 ? Date.class : Integer.class; } @Override public String getColumnName(int col) { return columnNames[col]; } @Override public int getColumnCount() { return columnNames.length; } @Override public int getRowCount() { return result.size(); } @Override public Object getValueAt(int row, int col) { return ((List) result.get(row)).get(col); } public void addRow(List<Object> value) { int rowCount = getRowCount(); result.add(value); fireTableRowsInserted(rowCount, rowCount); } public void addRows(List<Object>... value) { addRows(Arrays.asList(value)); } private void addRows(List<List><Object>> rows) { int rowCount = getRowCount(); result.addAll(rows); fireTableRowsInserted(rowCount, getRowCount() - 1); } } public class TableSwingWorker extends SwingWorker<MyTableModel, List><Object>> { private final MyTableModel tableModel; private ResultSet rs; public TableSwingWorker(MyTableModel tableModel, ResultSet rs) { this.tableModel = tableModel; this.rs = rs; } @Override protected MyTableModel doInBackground() throws Exception { // This is a deliberate pause to allow the UI time to render Thread.sleep(200); System.out.println("Start polulating"); int rownum = 0; int curCol = 0; int colCount = tableModel.getColumnCount(); while (rs.next()) { List<Object> row = new ArrayList<Object>(colCount); // new list per row int i = 1; while (i <= colCount) { // don't skip the last column, use <= curCol = i++; row.add(rs.getObject(curCol)); // } } publish(row); } return tableModel; } @Override protected void process(List<List><Object>> chunks) { System.out.println("Adding " + chunks.size() + " rows"); tableModel.addRows(chunks); } } }
But this code is working, but it fill on startup not when click button.
import java.awt.Component; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingWorker; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; public class TestTableLoad01 { static MyTableModel model; static JTable table; static ResultSet rs; JFrame frame; public static void main(String[] args) { new TestTableLoad01(); } public TestTableLoad01() { try { frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Connection conn = null; Statement stmt = null; conn = AS400ConnectionUtils.getConnection(); stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT * FROM XXX.TFMISNG"); ResultSetMetaData meta = rs.getMetaData(); int colCount = meta.getColumnCount(); String[] headers = new String[colCount]; for (int h = 1; h <= colCount; h++) { headers[h - 1] = meta.getColumnName(h); } model = new MyTableModel(headers); table = new JTable(model){ public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component component = super.prepareRenderer(renderer, row, column); int rendererWidth = component.getPreferredSize().width; TableColumn tableColumn = getColumnModel().getColumn(column); tableColumn.setPreferredWidth(Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth())); return component; } }; table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); table.setDefaultRenderer(Date.class, new TimeCellRenderer()); JPanel mainPanel = new JPanel(); mainPanel.setLayout(new GridBagLayout()); GridBagConstraints gridStatus1 = new GridBagConstraints(); gridStatus1.gridx = 0; gridStatus1.gridy = 0; gridStatus1.gridwidth = 1; gridStatus1.gridheight = 1; gridStatus1.anchor = GridBagConstraints.WEST; gridStatus1.fill = GridBagConstraints.BOTH; gridStatus1.weightx = 1.0; gridStatus1.weighty = 4.0; mainPanel.add(new JScrollPane(table), gridStatus1); gridStatus1.gridy = 1; gridStatus1.weighty = 0.3; frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationRelativeTo(null); frame.setPreferredSize(new Dimension(400, 200)); frame.setVisible(true); TableSwingWorker worker = new TableSwingWorker(model, rs); worker.execute(); } catch (Exception ex) { ex.printStackTrace(); } } public class TimeCellRenderer extends DefaultTableCellRenderer { private DateFormat df; public TimeCellRenderer() { df = new SimpleDateFormat("HH:mm:ss"); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value instanceof Date) { value = df.format(value); } super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); return this; } } public class MyTableModel extends AbstractTableModel { List<List><Object>> result = new ArrayList<List><Object>>(); private String[] columnNames; public MyTableModel(String[] headers) { columnNames = headers; } @Override public Class<?> getColumnClass(int columnIndex) { return columnIndex == 0 ? Date.class : Integer.class; } @Override public String getColumnName(int col) { return columnNames[col]; } @Override public int getColumnCount() { return columnNames.length; } @Override public int getRowCount() { return result.size(); } @Override public Object getValueAt(int row, int col) { return ((List) result.get(row)).get(col); } public void addRow(List<Object> value) { int rowCount = getRowCount(); result.add(value); fireTableRowsInserted(rowCount, rowCount); } public void addRows(List<Object>... value) { addRows(Arrays.asList(value)); } private void addRows(List<List><Object>> rows) { int rowCount = getRowCount(); result.addAll(rows); fireTableRowsInserted(rowCount, getRowCount() - 1); } } public class TableSwingWorker extends SwingWorker<MyTableModel, List><Object>> { private final MyTableModel tableModel; private ResultSet rs; public TableSwingWorker(MyTableModel tableModel, ResultSet rs) { this.tableModel = tableModel; this.rs = rs; } @Override protected MyTableModel doInBackground() throws Exception { // This is a deliberate pause to allow the UI time to render Thread.sleep(200); System.out.println("Start polulating"); int rownum = 0; int curCol = 0; int colCount = tableModel.getColumnCount(); while (rs.next()) { List<Object> row = new ArrayList<Object>(colCount); // new list per row int i = 1; while (i <= colCount) { // don't skip the last column, use <= curCol = i++; row.add(rs.getObject(curCol)); // } } publish(row); } return tableModel; } @Override protected void process(List<List><Object>> chunks) { System.out.println("Adding " + chunks.size() + " rows"); tableModel.addRows(chunks); } } }
Can anyone help me to fix my code? thanks.
Geoffrey Laurens
Greenhorn
Posts: 26
posted 10 years ago
Number of slices to send:
Optional 'thank-you' note:
Send
I Have already found the solutions
Campbell Ritchie
Marshal
Posts: 80653
476
posted 10 years ago
1
Number of slices to send:
Optional 'thank-you' note:
Send
And please tell us what the solution was.
Don't get me started about those stupid
light bulbs
.
reply
reply
Bookmark Topic
Watch Topic
New Topic
Boost this thread!
Similar Threads
JTable, Table Models, Vectors & Objects : Confused
? JTable getColumnName
Generate JTable from a SQL Query containing UNION clause
How to Display a JTable with the Data
TableModel question
More...