Problem mit TableSorter und TableModel

Juckie

Grünschnabel
Hallo!

Kann mir jemand weiterhelfen? Benutze die TableMap.java und TableSoter.java von http://java.sun.com/docs/books/tutorial/uiswing/components/table.html
damit man die Spalten in einer JTable anklicken kann und die dann sortiert werden. Habe auch ein eigenes TableModel.
Mein Problem ist nun, wenn ich eine neue Zeile per INSERT in die mySQL-Datenbank schreibe, dann wird mir diese neue Zeile in meinem JTable nicht angezeigt. Benutze auch die fireTableChanged-Methode, funktioniert aber nicht.
Weiß jemand weiter? Bin für jeden Tip dankbar!

Grüsse
Juckie
 
Hallo!

Schau mal hier:

Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
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.SQLException;
import java.sql.Statement;

import javax.swing.JButton;
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.table.DefaultTableModel;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

/*
 * BigMySQLJFrame.java
 *
 * Created on 7. April 2004, 09:20
 */

/**
 *
 * @author  Darimont
 */
public class BigMySQLJFrame extends JFrame {

	private JPanel bgPanel;
	private JButton btnConnect;
	private JButton btnSubmitInsertStatement;
	private JButton btnSubmitSelectStatement;
	private JPanel controlsPanel;
	private JLabel lblInsert;
	private JLabel lblSelect;
	private JScrollPane scrollPane;
	private JTable table;
	private JTextField txtInsert;
	private JTextField txtSelect;
	private Connection connection;
	private MysqlDataSource datasource;
	private DefaultTableModel model;
	private TableSorter sorter;

	static {
		try {
			Thread
				.currentThread()
				.getContextClassLoader()
				.loadClass("org.gjt.mm.mysql.Driver")
				.newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/** Creates new form BigMySQLJFrame */
	public BigMySQLJFrame() {
		initComponents();
	}

	/** This method is called from within the constructor to
	 * initialize the form.
	 * WARNING: Do NOT modify this code. The content of this method is
	 * always regenerated by the Form Editor.
	 */
	private void initComponents() {
		GridBagConstraints gridBagConstraints;

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		bgPanel = new JPanel();
		scrollPane = new JScrollPane();
		table = new JTable();
		controlsPanel = new JPanel();
		lblSelect = new JLabel();
		txtSelect = new JTextField();
		btnSubmitSelectStatement = new JButton();
		lblInsert = new JLabel();
		txtInsert = new JTextField();
		btnSubmitInsertStatement = new JButton();
		btnConnect = new JButton();

		getContentPane().setLayout(new FlowLayout());

		setTitle("BigMySQLJFrame");

		bgPanel.setLayout(new GridBagLayout());

		bgPanel.setBackground(new Color(51, 153, 255));
		bgPanel.setMinimumSize(new Dimension(400, 300));
		bgPanel.setPreferredSize(new Dimension(400, 300));
		scrollPane.setMinimumSize(new Dimension(400, 200));
		scrollPane.setPreferredSize(new Dimension(400, 200));

		//		table
		//			.setModel(
		//				new javax
		//				.swing
		//				.table
		//				.DefaultTableModel(new Object[][] {
		//					{ null, null, null, null },
		//					{
		//				null, null, null, null }, {
		//				null, null, null, null }, {
		//				null, null, null, null }
		//		}, new String[] { "Title 1", "Title 2", "Title 3", "Title 4" }));
		table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		scrollPane.setViewportView(table);

		bgPanel.add(scrollPane, new GridBagConstraints());

		controlsPanel.setBackground(new Color(255, 153, 0));
		controlsPanel.setMinimumSize(new Dimension(400, 100));
		controlsPanel.setPreferredSize(new Dimension(400, 100));
		lblSelect.setText("Select Statement: ");
		controlsPanel.add(lblSelect);

		txtSelect.setColumns(20);
		controlsPanel.add(txtSelect);

		btnSubmitSelectStatement.setText("GO");
		btnSubmitSelectStatement.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				btnSubmitSelectStatementActionPerformed(evt);
			}
		});

		controlsPanel.add(btnSubmitSelectStatement);

		lblInsert.setText("Insert Statement: ");
		controlsPanel.add(lblInsert);

		txtInsert.setColumns(20);
		controlsPanel.add(txtInsert);

		btnSubmitInsertStatement.setText("GO");
		btnSubmitInsertStatement.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				btnSubmitInsertStatementActionPerformed(evt);
			}
		});

		controlsPanel.add(btnSubmitInsertStatement);

		btnConnect.setText("connect");
		btnConnect.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				btnConnectActionPerformed(evt);
			}
		});

		controlsPanel.add(btnConnect);

		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 0;
		gridBagConstraints.gridy = 1;
		bgPanel.add(controlsPanel, gridBagConstraints);

		getContentPane().add(bgPanel);

		pack();
	}

	private void btnConnectActionPerformed(ActionEvent evt) {
		// Add your handling code here:
		try {
			if (connection == null || connection.isClosed()) {
				if (datasource == null) {
					datasource = new MysqlDataSource();
					datasource.setDatabaseName("test");
					datasource.setUser("root");
					datasource.setPort(3306);
					datasource.setServerName("localhost");
				}
				connection = datasource.getConnection();
				System.out.println("Connected");
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void btnSubmitInsertStatementActionPerformed(ActionEvent evt) {
		// Add your handling code here:
		String insertStatement = txtInsert.getText();
		if (insertStatement == null || insertStatement.equals("")) {
			System.out.println("Insert Statement ist leer...");
			return;
		}

		try {
			if (!(connection == null || connection.isClosed())) {
				Statement stmt = connection.createStatement();
				int updRows = stmt.executeUpdate(insertStatement);
				System.out.println(
					"Es wurden " + updRows + " Zeilen aktualisiert.");
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private void btnSubmitSelectStatementActionPerformed(ActionEvent evt) {
		// Add your handling code here:
		String selectStatement = txtSelect.getText();

		if (selectStatement == null || selectStatement.equals("")) {
			System.out.println("Select Statement ist leer...");
			return;
		}

		try {
			if (!(connection == null || connection.isClosed())) {
				Statement stmt = connection.createStatement();
				ResultSet rs = stmt.executeQuery(selectStatement);
				updateTableModel(rs);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * @param rs
	 */
	private void updateTableModel(ResultSet rs) {
		// TODO Auto-generated method stub
		try {
			ResultSetMetaData rsmd = rs.getMetaData();
			int clmCnt = rsmd.getColumnCount();

			rs.beforeFirst();
			rs.last();
			int rowNr = rs.getRow();

			Object[][] rows = new Object[rowNr][clmCnt];
			String[] clmHeaders = new String[clmCnt];

			for (int i = 1; i <= clmCnt; i++) {
				clmHeaders[i - 1] = rsmd.getColumnName(i);
			}

			rs.beforeFirst();
			int rowCnt = 0;

			while (rs.next()) {

				for (int i = 1; i <= clmCnt; i++) {
					rows[rowCnt][i - 1] = rs.getString(i);
					System.out.print(rows[rowCnt][i - 1] + " ");
				}
				rowCnt++;
				System.out.println();

			}

			model = new DefaultTableModel(rows, clmHeaders);
			sorter = new TableSorter(model);
			table.setModel(sorter);
			sorter.setTableHeader(table.getTableHeader());
			table.updateUI();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * @param args the command line arguments
	 */
	public static void main(String args[]) {
		new BigMySQLJFrame().show();
	}

}

Gruß Tom

[ JTable MySQL, sortieren ]
 

Anhänge

  • jtable.png
    jtable.png
    5,3 KB · Aufrufe: 293
Hallo!

Die TableSorter Klasse von Sun enthält noch einen kleinen Bug ... siehe Kommentare ... einfach nach Feld status suchen...

Code:
...
	private class MouseHandler extends MouseAdapter {
		public void mouseClicked(MouseEvent e) {
			JTableHeader h = (JTableHeader) e.getSource();
			TableColumnModel columnModel = h.getColumnModel();
			int viewColumn = columnModel.getColumnIndexAtX(e.getX());
			int column = columnModel.getColumn(viewColumn).getModelIndex();
			if (column != -1) {
				int dUmMy = getSortingStatus(column);
				if (!e.isControlDown()) {
					cancelSorting();
				}
				// Cycle the sorting states through {NOT_SORTED, ASCENDING, DESCENDING} or 
				// {NOT_SORTED, DESCENDING, ASCENDING} depending on whether shift is pressed. 
				//dUmMy = status + (e.isShiftDown() ? -1 : 1); ORIGINAL ZEILE
				dUmMy = dUmMy + (e.isShiftDown() ? -1 : 1);
				//dUmMy = (status + 4) % 3 - 1; ORIGINAL ZEILE
				dUmMy = (dUmMy + 4) % 3 - 1;
				// signed mod, returning {-1, 0, 1}
				//setSortingStatus(column, status); ORIGINAL ZEILE
				setSortingStatus(column, dUmMy);
			}
		}
	}

...

Quelle: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#sorting

Gruß Tom
 

Neue Beiträge

Zurück