Приветствую, уважаемые. У меня такая беда: работаю в JBuilder 2006, там используется JDK: java version 1.5.0_03-b07 Написал мелкий пример по работе с базой данных MySQL (выполняю запрос "select * from test.client;") Мускул самый свежий. Но не в нём беда. Проблема с методом makeTable(Vector rowData, Vector columnNames) в файле Window.java Итак, при попытке убрать с панели jp3 компонент JTable jtbl1 он убирается, и вроде как происходит перерисовка окна. Однако там есть ещё и замена jtbl1 новой таблицей и вставка этой новой таблицы на прежнее место. Вот тут перерисовка не происходит даже при jtbl1.repaint(); jp3.repaint(); this.repaint(); Окно перерисовывается только при повторном вызове this.setVisible(true); Меня интересует не делаю ли я через задницу всё это? ) По идее перерисовка окна должна производиться при вызове метода repaint(); Может нужно использовать что-то другое? Привожу код обоих файлов: | Код | //com\executor\Executor.java package com.executor;
import java.io.*; import java.util.*; import java.sql.*; import com.window.*;
public class Executor { static Connection conn = null; static Window wnd = null;
public Executor() { }
public static void operation() { Statement stmt = null; try { stmt = conn.createStatement(); } catch (SQLException ex2) { } ResultSet rs = null; try { rs = stmt.executeQuery(wnd.jta1.getText()); } catch (SQLException ex1) { ex1.printStackTrace(); } int columnCount = 0; try { columnCount = rs.getMetaData().getColumnCount(); } catch (SQLException ex4) { }
try { Vector<Vector> rowData = new Vector<Vector>(); Vector<String> columnNames = new Vector<String>(); for (int i = 1; i <= columnCount; i++) { columnNames.addElement(rs.getMetaData().getColumnName(i)); }
while (rs.next()) { Vector<String> v = new Vector<String>(1); for (int i = 1; i <= columnCount; i++) { v.addElement(rs.getString(i)); System.out.print(rs.getString(i) + "\t"); } rowData.addElement(v); System.out.print("\r\n"); } wnd.makeTable(rowData, columnNames); } catch (SQLException ex3) { }
// if(rs!=null)rs.close();
/** * stmt.close(); * При закрытии Statement автоматически закрываются * все связанные с ним открытые объекты ResultSet */
// if(stmt!=null)stmt.close(); try { stmt.close(); } catch (SQLException ex) { }
}
public static void main(String[] args) throws Exception { System.setOut(new PrintStream(new FileOutputStream("err.log", true), true)); wnd = new Window(); Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test", "root", "root");
if (conn == null) { System.out.println("Нет соединения с БД!"); System.exit(0); }
} }
|
и второй файл: | Код | //com\window\Window.java package com.window;
import javax.swing.*; import java.awt.*; import java.awt.event.*; import sun.awt.*; import java.util.*; import com.executor.*;
public class Window extends JFrame { JPanel jp1 = new JPanel(new VerticalBagLayout()); JPanel jp2 = new JPanel(new FlowLayout(FlowLayout.LEFT)); JPanel jp3 = new JPanel(new FlowLayout(FlowLayout.LEFT)); JPanel jp4 = new JPanel(new FlowLayout(FlowLayout.LEFT)); public JTextArea jta1 = new JTextArea(10, 60); public JTable jtbl1 = new JTable(2, 2); JButton jb = new JButton("Execute!"); MAction mActLis = null; public Window() { super(); this.setTitle("SQL Executor"); this.setSize(700, 420); //this.setResizable(false); this.setMinimumSize(new Dimension(700, 420)); this.setMaximumSize(new Dimension(700, 420)); this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); this.setLayout(new BorderLayout()); this.add(jp1, BorderLayout.CENTER); mActLis = new MAction(this); jta1.setWrapStyleWord(true); jp2.add(jta1); jp3.add(jtbl1); jp4.add(jb); jb.addActionListener(mActLis); jp1.add(jp2); jp1.add(jp3); jp1.add(jp4);
this.setVisible(true); //this.repaint(); }
public void makeTable(int numRows, int numColumns) { jtbl1 = new JTable(numRows, numColumns); this.repaint(); }
public void makeTable(Object[][] dataTable, String[] columnNames) { jtbl1 = new JTable(dataTable, columnNames); this.repaint(); } public void makeTable(Vector rowData, Vector columnNames) { jp3.remove(jtbl1); jtbl1 = new JTable(rowData, columnNames); jp3.add(jtbl1); //jtbl1.repaint(); //jp3.repaint(); //this.repaint(); //jp3.invalidate(); //this.getContentPane().invalidate(); //this.setVisible(false); this.setVisible(true); }
public void performAct() { //System.out.println("Йа обработчик кнопки!"); Executor.operation(); } }
class MAction extends AbstractAction { private Window adaptee; MAction(Window adaptee) { this.adaptee = adaptee; }
public void actionPerformed(ActionEvent e) { adaptee.setCursor(new Cursor(Cursor.WAIT_CURSOR)); if (e.getSource().equals(adaptee.jb)) { adaptee.performAct(); } adaptee.setCursor(Cursor.getDefaultCursor()); } }
|
В мускуле таблица client содержит два поля и две записи: Vasya Pupkin Sergey Sergeev
|