Обновление JTable из другого JFrame

На самом деле у меня есть JFrame (главное окно) с JTable. И пара кнопок типа Добавить,Удалить,Обновить.

Обновить использует функцию (updateTable), которая имеет следующий код ниже и отлично работает:

 try
        {
            ResultSet R = Home.getStatement().executeQuery("Select * from Schooldata");
            int count =0;
            while(R.next()) {  count++; }



school_data = new String[count][6];
            R = Home.getStatement().executeQuery("Select Schoolname,city,ProgramOpted,coordinator_name,Trainers,contactnum from Schooldata");
            count =0;
            while(R.next())
            {   
                for(int i=0;i<6;i++)
                {   school_data[count][i]= R.getString(i+1);
                    System.out.println(R.getString(i+1));
                }
                count++;
            } 
        }
        catch(SQLException S)   {JOptionPane.showMessageDialog(null,S);}

         jTable1.setModel(new DefaultTableModel(school_data,new String [] {
                "School Name", "City", "Program", "Coordinator", "Trainers", "Contact Number"
            }));

Когда я нажимаю «Добавить», появляется другое окно JFrame и запрашивает сведения, которые далее сохраняются в базе данных, показывает сообщение с подтверждением и обновляет таблицу (в другом JFrame, т.е. в главном окне) с использованием вышеуказанной функции.

Проблема в том, что я вызываю ту же функцию, но из другого JFrame. Ожидая, что изменения будут отражены в основном JFrame.

Используя метод new Main().updateTable(); в приведенном ниже коде, он просто не работает.

try
            {
                int confirm = Home.getStatement().executeUpdate(Query);
                if(confirm == 1)
                {
                    JOptionPane.showMessageDialog(null,"Record Added","Saved",1);
                    new Main().updateTable();
                }
                else  JOptionPane.showMessageDialog(null,"There is some Error.....","Error",0);


            }
            catch(SQLException S)
            {
                JOptionPane.showMessageDialog(null,S,"Error",0);
            }

person Chetan Lakhanpal    schedule 21.09.2014    source источник
comment
comment
Но на самом деле я делал это так, используя setVisible(true) для другого JFrame и используя dispose(); для предыдущего JFrame, это все еще неправильно?   -  person Chetan Lakhanpal    schedule 22.09.2014


Ответы (2)


Ваша проблема, я полагаю, здесь (трудно сказать без минимального примера программы):

int confirm = Home.getStatement().executeUpdate(Query);
if(confirm == 1)
{
    JOptionPane.showMessageDialog(null,"Record Added","Saved",1);
    new Main().updateTable();  // ****** HERE ******
}

Вы создаете совершенно новый объект Main, меняете его состояние и надеетесь, что это изменит состояние визуализированного объекта Main, но обнаруживаете, что нет, не изменит.

Вместо этого вам нужно передать ссылку на визуализированный объект Main в приведенный выше код, а затем вызывать методы для него, а не для вновь созданного совершенно уникального объекта.

Что бы вы ни делали, не пытайтесь решить эту проблему, делая поля или методы static. Да, это может сработать, но это нарушает ООП и затрудняет тестирование или расширение вашей программы.


Кроме того, это второе зависимое окно не должно быть другим JFrame и, скорее всего, должно быть модальным JDialog. Поскольку, если вы используете JDialog, коду диалога не нужно будет проталкивать информацию в вызывающее окно. Скорее вызывающий код будет узнавать, когда вы закончите работу с диалоговым окном, и поэтому в этот момент, если состояние диалогового окна хорошее (если вы не сказали отменить его без изменений), то вызывающий код может легко извлекать информацию из кода диалога. Для конкретного примера того, о чем я говорю, посмотрите мой ответ на аналогичный вопрос о передаче информации между двумя окнами здесь.

Также аналогичную проблему и решение можно найти здесь.

person Hovercraft Full Of Eels    schedule 21.09.2014
comment
OP также создает новый экземпляр JTable... понятия не имею, были ли удалены старые или добавлены новые +1 - person MadProgrammer; 22.09.2014
comment
@MadProgrammer: спасибо. Да, mcve было бы неплохо прояснить ситуацию! - person Hovercraft Full Of Eels; 22.09.2014
comment
Спасибо, я дам вам знать, как только сделаю это с JDialog. - person Chetan Lakhanpal; 22.09.2014

Посмотрите, выбрасываете ли вы основной или нет. Если нет, попробуйте создать объект основного фрейма и попробуйте получить к нему доступ для обновления таблицы. Вы также можете добавить импорт для файла .java Main Frame в файл диалога обновления и попробовать обновить таблицу. Также проверьте, является ли ваша таблица общедоступной статической или нет, чтобы получить к ней доступ из другого фрейма. Если вы создадите функцию обновления для этой цели, то это будет лучше всего. Мой код для функции выглядит так:

    import package.mainframe;

or

    MainFrame mainframe = new MainFrame();
    try
        {
            int confirm = Home.getStatement().executeUpdate(Query);
            if(confirm == 1)
            {
                JOptionPane.showMessageDialog(null,"Record Added","Saved",1);
                mainframe.updateTable();    //or mainframe.functioncall();
            }
            else  JOptionPane.showMessageDialog(null,"There is some Error.....","Error",0);


        }
        catch(SQLException S)
        {
            JOptionPane.showMessageDialog(null,S,"Error",0);
        }
person advay rajhansa    schedule 12.11.2014
comment
со статическим это работает. И другой случай может быть с JDialog. - person Chetan Lakhanpal; 16.11.2014