JTable не обновляется при выборе из Combobox

Таблица scrollPane не обновляется каждый раз, когда я выбираю что-то из комбинации. Первоначально у него есть данные, но после того, как я что-то выбрал, данные успешно удаляются, но новые данные не заполняются.

public void ConsultFrame(String id, String name, String ic){
    GenerateMed("dp-000"); // to begin the scrollpane filled with Fever's medicine
    JButton proc = new JButton("Proceed");
    JButton addmed = new JButton(">>");

    selected = new JTable(data, columnNames){
        @Override
        public boolean isCellEditable(int row,int column){  
            switch(column){             
                case 0:
                    return false; 
                case 1:
                    return false;
            default: return true;
            }
    }};
    selectedPane = new JScrollPane(selected);

    //Dispensary's category combobox related
    disp = dbDisp.getDispensary();
    final JComboBox cBox = new JComboBox();
    for(int count=0; count<disp.size(); count++)
        cBox.addItem(disp.get(count).getDSP_desc());
    cBox.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent event) {
            for(int count=0; count<disp.size(); count++){
                if(cBox.getSelectedItem().equals(disp.get(count).getDSP_desc())){
                    System.out.println(disp.get(count).getDSP_ID());
                    GenerateMed(disp.get(count).getDSP_ID());
                    break;
                }
            }
        }
    });

    JTextArea tArea = new JTextArea(5, 30);
    JScrollPane desc = new JScrollPane(tArea);
    tArea.setLineWrap(true);
    desc.setVerticalScrollBarPolicy ( ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS );

    JPanel info = new JPanel();
        info.setLayout(new FlowLayout(FlowLayout.LEFT));
        info.add(new JLabel("<html>Patient's ID : " + id + "<br>Patient's Name: " + name + "<br>Patient's IC : " + ic + "<br><br>Medical Description : </html>"));
        info.add(desc);

    JPanel medSelect = new JPanel();
        medSelect.setLayout(new GridLayout(1,2));
        medSelect.add(scrollPane);
        medSelect.add(selectedPane);

    JPanel medic = new JPanel();
        medic.setLayout(new BorderLayout());
        medic.add(cBox, BorderLayout.NORTH);
        medic.add(medSelect, BorderLayout.CENTER);
        medic.add(proc, BorderLayout.SOUTH);

    JPanel all = new JPanel();
        String timeStamp = new SimpleDateFormat("yyyy/MM/dd HH:mm").format(Calendar.getInstance().getTime());
        title = BorderFactory.createTitledBorder(timeStamp);
        title.setTitleJustification(TitledBorder.RIGHT);
        all.setBorder(title);
        all.setLayout(new GridLayout(2,1));
        all.add(info);
        all.add(medic);

    JFrame consult = new JFrame();
        consult.setTitle(name + "'s consultation");
        consult.setResizable(false);
        consult.setVisible(true);
        consult.setSize(500, 460);
        consult.setLocationRelativeTo(null);

        consult.add(all);
}

Вот куда направляется мой Combobox, как только что-то выбрано, и я пробовал перерисовывать и перепроверять

public void GenerateMed(String dps_id){
    if (tModel != null) {
        for (int i = tModel.getRowCount() - 1; i > -1; i--)
            tModel.removeRow(i);
    }

    tModel = dbMed.getDPSMedicine(dps_id);
    tModel.fireTableDataChanged();

    table = new JTable(tModel){
        @Override
        public boolean isCellEditable(int row,int column){             
                    return false;
    }};
    table.setShowGrid(false);
    table.setShowHorizontalLines(false);
    table.setShowVerticalLines(false);

    //Table customization
    table.getTableHeader().setReorderingAllowed(false);
    table.setRowSelectionAllowed(true); 
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    table.changeSelection(0, 0, false, false);

    scrollPane = new JScrollPane(table);
    scrollPane.repaint();
    scrollPane.revalidate();
}

person Leon    schedule 19.03.2014    source источник
comment
ScrollPane не добавляется ни в какой контейнер, и это не окно, вы должны добавить его во фрейм, также вам не нужно создавать новый JScrollPane или новый JTable.   -  person nachokk    schedule 19.03.2014


Ответы (1)


scrollPane = new JScrollPane(table);

Приведенная выше строка кода создает новую панель прокрутки, но не добавляет панель прокрутки в фрейм.

Однако нет необходимости даже создавать новый JTable или новый JScrollPane. Избавьтесь от всего кода.

Вместо этого вы просто меняете модель своего JTable, используя:

table.setModel( dbMed.getDPSMedicine(dps_id) );

Таким образом, ваш метод становится одной строкой кода.

Кроме того, используйте правильные имена методов. Имена методов НЕ ДОЛЖНЫ начинаться с заглавной буквы.

person camickr    schedule 19.03.2014
comment
Это сработало как шарм, но две вещи: i. Он не показывает имена столбцов в таблице ii. как добавить переопределение в «таблицу»? нравится . . code table = new JTable(tModel){ @Override public boolean isCellEditable(int row,int column){ return false; }}; - person Leon; 20.03.2014
comment
Ааа .. решил я. :D Я использовал метод link - person Leon; 20.03.2014
comment
@ user3083413, зачем вам это решение? Все, что вам нужно сделать, это отобразить таблицу в JScrollPane. Поскольку вы сказали, что изначально код работает, все, что вам нужно сделать, это сбросить модель, и заголовки столбцов будут обновлены автоматически. - person camickr; 20.03.2014