Jtable i dodawanie/usuwanie wierszy

0

Witam wszystkich forumowiczów. Jeśli problem który poniżej opisuję pojawił się już na forum to przepraszam za robienie bałaganu. Mój problem dotyczy czegoś takiego. Mam tablicę utworzoną przez obiekt modelu (klasa dziedzicząca z DefaultTableModel). Posiadam też przyciski do dodania i usunięcia wiersza modelu(a zarazem i tabeli). Poniżej trochę kodu:

// usuwanie zaznaczonego wiersza
   public void jButton1_actionPerformed(ActionEvent e) {
        int ktory = tabela.getSelectedRow();

        if(ktory >= 0)
        {
           modelDefault.removeRow(ktory); // usunięcie z modelu
          
        }
         else
             JOptionPane.showMessageDialog(Tables.this,"Nothing to                                  delete","Info",JOptionPane.INFORMATION_MESSAGE);
    }

// dodawanie wiersza
   public void jButton3_actionPerformed(ActionEvent e) {
        Vector v = new Vector();
        for(int i = 0; i < modelDefault.getColumnCount(); i++)
        {
            Integer liczba = new Integer(21);
            v.add(liczba);
        }
        modelDefault.addRow(v);
    }

Model utworzyłem tak że zawiera 20 wierszy.
Po uruchomieniu programu i zaznaczeniu jakiegoś wiersza zarówno przy dodawaniu jak i usuwaniu występuje wyjątek.
Przy dodawaniu:
java.lang.ArrayIndexOutOfBoundsException: 20 > 0 (20 to ilość wierszy)
Przy usuwaniu:
java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 15
(15 to aktualnie zaznaczony przeze mnie wiersz tabeli). Czy ma ktoś jakiś pomysł jak to rozwiązać. Bo ja nie mogę dojść gdzie popełniam błąd.

0

hej
na szybcika wklepałem twój kod do programiku testowego i u mnie to działa wszystko w porządku. Może źle inicjujesz tabelę? Ja to mam tak:
modelDefault=new DefaultTableModel(20,5); //20 wierszy, 5 kolumn
tabela=new JTable(modelDefault); //skojarzenie tabeli z modelem
potem buttony:
button1=new JButton("remove");
button1.addActionListener(this);
button2=new JButton("add");
button2.addActionListener(this);
i metoda obsługi zdarzeń tak ja u ciebie:
public void actionPerformed(ActionEvent evt) {
if(evt.getSource()==button1){
int ktory = tabela.getSelectedRow();
if(ktory >= 0)
modelDefault.removeRow(ktory); // usunięcie z modelu
else
JOptionPane.showMessageDialog(null,"Nothing to delete","Info",JOptionPane.INFORMATION_MESSAGE);
}else{ //button2
Vector v = new Vector();
for(int i = 0; i < modelDefault.getColumnCount(); i++)
{
Integer liczba = new Integer(21);
v.add(liczba);
}
modelDefault.addRow(v);
}
}
i to działa bez problemów

0

Co do inicjalizacji modelu to mam tak

        modelDefault = new mojModelDefault(20,5);
        tabela = new JTable(modelDefault);

Natomiast sama implementacja modelu jest następująca:

   private class mojModelDefault extends DefaultTableModel
{

    public mojModelDefault(int wierszy,int kolumn) {
       this.wierszy = wierszy;
       this.kolumny = kolumn;
    }

    public int getRowCount() {
        return this.wierszy;
    }

    public int getColumnCount() {
        return this.kolumny;
    }

    public Object getValueAt(int r, int c) {
      
       return "" + (r + 1);
    }


  public boolean isCellEditable(int r,int c)
  {
      return false;
  }

    private int wierszy;
    private int kolumny;

}

Może jest coś nie tak w modelu lub powiązaniu tabeli z modelem ?

0

twoja klasa potomna z Model nie posiada konstruktora klasy pierwotnej, i dlatego się to wysypuje, możesz zrobić np. tak:
1 metoda: pozostawić swoje metody, ale zamiast this wstawić super, czyli:
public mojModelDefault(int wierszy,int kolumn) {
super(wierszy,kolumn);
}

public int getRowCount() {
    return super.getRowCount();
}

public int getColumnCount() {
    return super.getColumnCount();
}

reszta metod może pozostać bez zmian, możesz usunąć pola wiersze i kolumny

2 metoda: usunąć z klasy potomnej te 3 metody z this (zostawić jedynie iscelleditable oraz getvalueat) i zainicjiować to jako:
modelDefault=new mojModelDefault();
modelDefault.setColumnCount(5);
modelDefault.setRowCount(20);
czyli w sposób ręczny, też zadziała

0

Dzięki wielki, teraz mi ruszyło

1 użytkowników online, w tym zalogowanych: 0, gości: 1