JTable i ListSelectionModel

0

witam
oto przykładowy kod

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;

public class doProb {

public static void main(String[] a) {
    JFrame frame = new JFrame();
    frame.setLayout(new BorderLayout());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    JPanel p1 = new JPanel(new BorderLayout());
    JPanel p2 = new JPanel(new BorderLayout());

    final JTable table;

    String[] columnTitles = { "A", "B", "C", "D" };
    Object[][] rowData = { { "11", "12", "13", "14" }, { "21", "22", "23", "24" },
        { "31", "32", "33", "34" }, { "41", "42", "44", "44" } };
    final DefaultTableModel model1 = new DefaultTableModel(rowData,columnTitles);
    table = new JTable(model1);
    
    final JTable table2;

    String[] columnTitles2 = { "A", "B", "C", "D" };
    Object[][] rowData2 = {  };
    final DefaultTableModel model2 = new DefaultTableModel(rowData2,columnTitles2);
    table2 = new JTable(model2);

    table.setCellSelectionEnabled(true);
    ListSelectionModel cellSelectionModel = table.getSelectionModel();
    cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
      public void valueChanged(ListSelectionEvent e) {
    	  System.out.println("1 słuchacz");
    	  int i2,size2;//kasowanie wierszy
      	  size2 = model2.getRowCount();
      	  for(i2=size2-1; i2>=0; i2--){
      		 model2.removeRow(i2);  
      	  }
    	Object selectedData;
        int[] selectedRow = table.getSelectedRows();
        int[] selectedCol = table.getSelectedColumns();
        selectedData =  table.getValueAt(selectedRow[0], selectedCol[0]);                   
        System.out.println("Selected: " + selectedData);
        model2.addRow(new Object[]{selectedData, selectedData, selectedData});      
      }
    });

    table2.setCellSelectionEnabled(true);
    ListSelectionModel cellSelectionModel2 = table2.getSelectionModel();
    cellSelectionModel2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    cellSelectionModel2.addListSelectionListener(new ListSelectionListener() {
        public void valueChanged(ListSelectionEvent e) {
        	System.out.println("2 słuchacz");
        	Object selectedData2;
            int[] selectedRow2 = table2.getSelectedRows();
            int[] selectedCol2 = table2.getSelectedColumns();
            selectedData2 = table.getValueAt(selectedRow2[0], selectedCol2[0]);                  
            System.out.println("Selected: " + selectedData2);
            model1.addRow(new Object[]{selectedData2, selectedData2, selectedData2});
      }
    });
    
    p1.add(new JScrollPane(table));
    frame.add(p1, BorderLayout.NORTH);
    p2.add(new JScrollPane(table2));
    frame.add(p2, BorderLayout.CENTER);

    frame.setSize(300, 600);
    frame.setVisible(true);
  }
} 

powyższy kod bez linijki model2.removeRow(i2); działa dobrze, naprzemienne dodawanie wierszy jest ok
natomiast z linijką **model2.removeRow(i2); ** naprzemienne dodawanie wierszy już nie

po wielu testach doszedłem tylko do tego iż **model2.removeRow(i2); ** powoduje wywołanie 2 słuchacza i błąd związany z brakiem wartości w tablicy selectedRow2

Dlaczego się tak dzieje?
I jak to poprawnie zrobić aby naprzemiene dodawanie wierszy do tabel (przy usuwaniu wszystkich wierszy z 2 tabeli) działało poprawnie?

dzięki za każdą sugestię

0

Dlaczego się tak dzieje?
To chyba jest oczywiste, w dolnej tabeli usunąłeś wszystkie wiersze więc rozmiar tablicy table2.getSelectedRows() wynosi 0.
Sprawdzaj rozmiar tych tablic

                int[] selectedRow2 = table2.getSelectedRows();
                int[] selectedCol2 = table2.getSelectedColumns();
                if(selectedRow2.length>0 && selectedCol2.length>0)
                {
                    selectedData2 = table.getValueAt(selectedRow2[0], selectedCol2[0]);
                    System.out.println("Selected: " + selectedData2);
                    model1.addRow(new Object[]{selectedData2, selectedData2, selectedData2});
                }
0

Oki te tak zrobiłem parę minut temu

Ale dlaczego model2.removeRow(i2); wywołuje 2 słuchacza?

0

Bo w dolnym oknie było coś zaznaczone, usunąłeś wszystkie wiersze z tego okna więc usunąłeś zaznaczenie, zatem zadziałał ListSelectionListener.

0

Oki, dzięki

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