Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите распределить общение с базой на потоки, помогите создать поток 
V
    Опции темы
CAHTA
Дата 6.6.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.6.2008

Репутация: нет
Всего: нет



Извините за может быть глупый вопрос. пишу на ява впервые. Хочу сделать так чтоб во время работы с таблицей изменения в базу передавались в другом потокe не тормозя редактирование таблицы. Это методы updrow(), addrow(), и delrow().  Особенно волнует updrow(), т.к. обновляет данные после изменения каждой ячейки. Пытался почитать форумы и литературу ниче не получилось, поэтому потоки вообще убрал, так хоть работает. Покажите пожалуйста на примере одного из этих методов как вызвать работающий поток для общения с ораклом, не мешая при этом редактировать таблицу в окне. Заранее спасибо. Сорри за длинный код.

Код

import javax.swing.*;
import javax.swing.event.TableModelListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.*;
import java.sql.*;
import java.awt.*;
import java.awt.event.*;
import java.util.concurrent.Callable;
import java.math.BigDecimal;
import java.math.BigInteger;

public class baseTable {
    private JTable table1;
    private JPanel Jpanel1;
    private JScrollPane jsp1;
    private conOracle co = new conOracle();//это мой клас там только соединение с ораклом
    private Object [][] datacards;
    private Object [][] datatests;
    private Object [][] datares;
    private String framename;
    private String query;
    private Object [][] data;
    private Object [][] tempdata;
    private String [] colHeads;
    private tblModel tm;
    private int table_num;
    public baseTable(int table_id) throws SQLException {

        switch (table_id) {  // Это просто выбор таблицы какая будет отбражаться
        case (1):
            table_num= table_id;
            query = "Select * From Cards ORDER BY CARD_ID";// order by CREATOR, CARD, MANUFACTURER, M_SIZE, M_TYPE";
            framename = "Таблица Видеокарты (CARDS)";
            baseTable.this.showTable (query);
            baseTable.this.showFrame (framename);
            break;
        case (2):
            table_num= table_id;
            query = "Select * From Tests ORDER BY TEST_ID";// ORDER BY TEST, DX_VERSION";
            framename = "Таблица ТЕСТЫ (TESTS)";
            colHeads = new String [4];
            baseTable.this.showTable (query);
            baseTable.this.showFrame (framename);
            break;
        case (3):
            table_num= table_id;
            query = "SELECT * FROM RESULTS ORDER BY RES_ID";// ORDER BY RES_ID, TEST_ID, CARD_ID, RESULT, OVER";
            framename = "Таблица Результаты (Results)";
            baseTable.this.showTable (query);
            baseTable.this.showFrame (framename);
            break;
        }
        CellEditorListener l = new CellEditorListener(){
           public void editingStopped(ChangeEvent e) {
               updrow(table_num);                      //отпраляет запрос на обновление данных в базе
           }
           public void editingCanceled(ChangeEvent e) {
           }
        };
        TableCellEditor [] tce=new TableCellEditor[6];
        for (int i=1; i<table1.getColumnCount();i++){
            tce[i-1]=table1.getDefaultEditor(table1.getColumnClass(i));
            tce[i-1].addCellEditorListener(l);
            table1.getColumn(table1.getColumnName(i)).setCellEditor(tce[i-1]);
        }


        table1.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                super.keyPressed(e);
                if (e.getKeyCode()== KeyEvent.VK_ENTER){
                    if((table1.getSelectedRow()+1==table1.getRowCount())||(table1.getRowCount()==0)){
                        if(table1.isEditing()){
                            int ic=table1.getEditingColumn();
                            table1.getDefaultEditor(table1.getColumnClass(table1.getEditingColumn())).stopCellEditing(); //знаю что криво но по другому не работает
                        }
                        addrow(table_num); //добаляет пустую строку к таблице
                        return;
                    }
            }
                 if(e.getKeyCode()== KeyEvent.VK_DELETE){
                     delrow(table_num);
                 }          
            }
        });

    }
    public void addrow (int table_id){     //Добаляет 1 пустую строку к таблице в окне и соответсвенно в базе

        String query1 = "";
        int rowcount=0;
        int colcount = colHeads.length;
        if (data == null){
            rowcount = 0;
        }
        else{
            rowcount = data.length;
        }
        tempdata=data;
        data=new Object [rowcount+1][colcount];
        for (int i = 0; i< rowcount; i++ ){
                for (int j = 0; j< colcount; j++ ){
                    data[i][j] = tempdata [i][j];
                }
            }
        Connection conn = co.conn;
        switch (table_id){
        case (1):
            query1 = "{call ADD_CARD (?, ?, ?, ?, ?, ?)}";
            try {
                CallableStatement cst = conn.prepareCall(query1);
                cst.setNull(1, java.sql.Types.VARCHAR);
                cst.setNull(2, java.sql.Types.VARCHAR);
                cst.setNull(3, java.sql.Types.VARCHAR);
                cst.setNull(4, java.sql.Types.VARCHAR);
                cst.setNull(5, java.sql.Types.INTEGER);
                cst.setNull(6, java.sql.Types.VARCHAR);
                cst.executeQuery();
                baseTable.this.showTable (query);
            }
            catch (SQLException e1) {
                e1.printStackTrace();
                JOptionPane.showConfirmDialog(null, "Ошибка данных",
                "Ошибка", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);
                return;
            }
        break;
        case (2):
            query1 = "{call ADD_TEST (?, ?, ?)}";
            try{
                CallableStatement cst = conn.prepareCall(query1);
                cst.setNull(1, java.sql.Types.VARCHAR);
                cst.setNull(2, java.sql.Types.VARCHAR);
                cst.setNull(3, java.sql.Types.VARCHAR);
                cst.executeQuery();
                baseTable.this.showTable (query);
            }
            catch (SQLException e1) {
                e1.printStackTrace();
                JOptionPane.showConfirmDialog(null, "Ошибка данных",
                "Ошибка", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);
                return;
            }
            break;
        case (3):
            query1 = "{call ADD_RES_DIR (?, ?, ?, ?)}";
            try{
                CallableStatement cst = conn.prepareCall(query1);
                cst.setNull(1, java.sql.Types.NUMERIC);
                cst.setNull(2, java.sql.Types.NUMERIC);
                cst.setNull(3, java.sql.Types.NUMERIC);
                cst.setNull(4, java.sql.Types.NUMERIC);       
                cst.executeQuery();
                baseTable.this.showTable (query);
            }
            catch (SQLException e1) {
                e1.printStackTrace();
                JOptionPane.showConfirmDialog(null, "Ошибка данных",
                "Ошибка", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);
                return;

            }
            break;

        };
    }
    public void updrow (int table_id){      //обновляет строку в базе
        int row_number = table1.getSelectedRow();
        if (row_number == -1){
            row_number = table1.getEditingRow();
        }
        if (row_number == -1){
            return;
        }
        String updquery = "Select";
        Object [] updrow = new Object [table1.getColumnCount()]; //массив со значениями обновляемых данных
        switch (table_id) {  //выбор таблицы
        case (1):
            updquery = "{call UPD_CARD (?, ?, ?, ?, ?, ?, ?)}";
            break;
        case (2):
            updquery = "{call UPD_TEST (?, ?, ?, ?)}";
            break;
        case (3):
            updquery = "{call UPD_RES (?, ?, ?, ?, ?)}";
            break;
         }
        Connection conn = co.conn;
        try{
            CallableStatement cst = conn.prepareCall(updquery);
            for (int i = 0; i < updrow.length; i++){
                updrow[i]=table1.getValueAt(row_number, i);
            }
            for (int i = 0; i < updrow.length; i++){  //задание параметров вызова процедуры в базе
                if (updrow[i]== null){
                    cst.setNull(i+1,java.sql.Types.VARCHAR );
                }
                else {
                    if ((updrow[i].getClass() == String.class)||
                        (updrow[i].getClass() == char.class)){
                        cst.setObject(i+1,updrow[i], java.sql.Types.VARCHAR);
                    }
                    if ((updrow[i].getClass() == BigDecimal.class) ||
                        (updrow[i].getClass() == BigInteger.class)){
                        cst.setObject(i+1,updrow[i], java.sql.Types.NUMERIC);
                    }
                }
            }
            cst.execute();
        }
        catch (SQLException e1) {
            e1.printStackTrace();
            JOptionPane.showConfirmDialog(null, "Ошибка данных",
            "Ошибка", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE); 
            return;
        }
        showTable(baseTable.this.query);
    }
    public void delrow (int table_id){   //удаляет выбранную строку из таблицы в окне и в базе
        int row_number = table1.getSelectedRow();
        String id = table1.getValueAt(row_number,0).toString();
        String delquery = "Select";
        switch (table_id) {
        case (1):
            delquery = "Delete from cards where card_id = " + id;
            break;
        case (2):
            delquery = "Delete from tests where test_id = " + id;
            break;
        case (3):
            delquery = "Delete from results where res_id = " + id;
            break;
         }
        Connection conn = co.conn;
        try {
            Statement st = conn.createStatement();
            st.execute(delquery);
        } catch (SQLException e) {
            e.printStackTrace();
            JOptionPane.showConfirmDialog(null, "Ошибка данных",
            "Ошибка", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);
            return;
        }
        showTable (baseTable.this.query);
    }
    public void showTable (String query){ //заведует отбражением таблицы на экране
        ResultSet rs;
        int rowcount =0;
        int colcount;
        try {
            Connection conn = co.conn;
            PreparedStatement pst = conn.prepareStatement(query,
            ResultSet.TYPE_SCROLL_INSENSITIVE,
            ResultSet.CONCUR_READ_ONLY );
            rs = pst.executeQuery();
            colcount = rs.getMetaData().getColumnCount();
            colHeads = new String [colcount];
            for (int i=1; i<=colcount; i++){
                colHeads[i-1]=rs.getMetaData().getColumnName(i);
            }
            while (rs.next()){
                rowcount++;
            }
            rs.beforeFirst();
                data = new Object [rowcount][colcount];
                while (rs.next()){
                    for (int i=1; i<=colcount;i++){
                        if (rs.getObject(i)==null){
                            data[rs.getRow()-1][i-1]= null;    
                        }
                        else {
                            data[rs.getRow()-1][i-1]=rs.getObject(i);
                        }    
                    }
                }

            tm = new tblModel(data, colHeads);
            TableSorter sorter = new TableSorter(tm,table1.getTableHeader());
            table1.setModel(sorter);
        }
        catch (SQLException e) {
            e.printStackTrace();
            JOptionPane.showConfirmDialog(null, "Ошибка данных",
            "Ошибка", JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);
            return;
        }
    }
    public void showFrame (String framename){
        JFrame frame = new JFrame (framename);
        frame.setContentPane(Jpanel1);
        frame.pack();
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }


}


PM MAIL   Вверх
ecologist
Дата 7.6.2008, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: нет
Всего: 9



PM MAIL   Вверх
CAHTA
Дата 10.6.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.6.2008

Репутация: нет
Всего: нет



ecologist, спасибо большое!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0436 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.