JTable ListSelection Event nicht ausführen beim Reordering?

Ryu20

Mitglied
Hi,

Ich habe ein kleines Problem, ich habe eine JTable bei der Events ausgeführt erden, sobald eine Zelle angeklickt wird. Mein Problem ist das auch Events ausgeführt werden wenn ich die Spalten neu ordne ( setReorderingAllowed(true); wenn ich eine Spalte an eine andere Position ziehe)

Weiß jemand wie ich nur Events ausführen kann wenn eine Zelle selektiert wird?

Ich habe hier ein kleines Beispiel (zum besseren Verständnis)


Code:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.Dimension;
import java.awt.GridLayout;

public class TableSample extends JPanel {


    public TableSample() {
        super(new GridLayout(1,0));

        String[] columnNames = {"1",
                "2",
                "3",
        "4"};

        Object[][] data = {
                {"A", "B", "C", new Integer(1)},
                {"D", "E", "F", new Integer(2)},
                {"G", "H", "I", new Integer(3)},
                {"J", "K", "L", new Integer(4)},
                {"M", "N", "O", new Integer(50)}
        };

        final JTable table = new JTable(data, columnNames);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);
        table.setColumnSelectionAllowed(true);
        table.getTableHeader().setReorderingAllowed(true);
        
        Listener listener = new Listener(table);
        table.getSelectionModel().addListSelectionListener(listener);
        table.getColumnModel().getSelectionModel().addListSelectionListener(listener);
        JScrollPane scrollPane = new JScrollPane(table);
        this.add(scrollPane);

    }


    private static void createAndShowGUI() {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        TableSample newContentPane = new TableSample();
        newContentPane.setOpaque(true);
        frame.setContentPane(newContentPane);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

class Listener implements ListSelectionListener{

    JTable table;

    public Listener(JTable table){
        this.table = table;
    }

    @Override
    public void valueChanged(ListSelectionEvent e) {
        // TODO Auto-generated method stub
        if (e.getSource() == table.getSelectionModel()
                && table.getRowSelectionAllowed()) {
            System.out.println("Row");
        } else if (e.getSource() == table.getColumnModel().getSelectionModel()
                && table.getColumnSelectionAllowed() ){
            System.out.println("Col");
        }
    }

}
Vielen Dank schonmal
 
Hi,

unter den gegebenen Umständen musst du wohl mit dem Verhalten der JTable leben.

Die JTable arbeitet eben so mit dem DefaultSelectionModelen zusammen.
Wo man dort den Hebel zur beseitigung des Problems ansetzen sollte ?
Gute Frage ... sollte man mal in einem Forum diskutieren ! :-)

Gruß JAdix
 
hi

die einzige Möglichkeit auf die ich gekommen bin war ein boolean auf false zu setzen wenn der Inhalt vom Event nicht ausgeführt werden soll, habe aber eine komplett andere Lösung gefunden die mein Hauptproblem war, also kann das Event jetzt ohne Probleme ausgeführt werden

Danke
 
Zurück