getSelectedRow() springt bei JButton-Auswahl nicht weiter mit

Bitte aktiviere JavaScript!
Hallo!
Ich habe schon diverse Google-Einträge und das FAQ durchsucht und leider nichts passendes gefunden.

Ich schreibe an einem kleinen Programm, welches mir Textpassagen aus einer TXT-Datei rausparst und mir in einem JTable anzeigt. Die vorderen 7 Spalten sind jeweils nur angezeigter Text. Von Spalte 8-15 ist die jeweilige Zelle als JButton dargestellt. Um die Position des geklickten Buttons rauszufinden, benutze ich zunächst getColumnName und für die Zeile getSelectedRow. Allerdings springt die markierte Zeile nicht mit, wenn ich auf einen Button klicke, sondern nur wenn ich in den ersten sieben Spalten bleibe und dort auf eine Zeile klicke.
Wie kann ich die gewählte Zeile beim Klick auf JButtons mitspringen lassen?

Liebe Grüße und Danke!
 

Anhänge

A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Nein. Meine Vermutung ist, dass es an der Art und Weise liegt, wie Du die Buttons zur Tabelle hinzufügst. Wie hast Du das gemacht?
 
Okay. Hänge meinen Code mal an. Mir ist aufgefallen, dass die Zeilenmarkierung in der Tabelle mitrutscht, allerdings nur bei Durchlaufen mit den Pfeiltasten, wenn ich den Buttonrenderer rauslasse. Bei Klick auf einen Button bleibt die Zeile jedoch an der Stelle wo sie vorher war.

Java:
public class TibCoTable extends JFrame{

    private final JScrollPane scrollPane;
    


    public TibCoTable(String[][] Table, String[] titel, int width, int heigth) {
        super();
        Font font = new Font("DialogInput", Font.BOLD, 20);
        JTable table = new JTable(Table, titel);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        table.setBackground(Color.white);
        table.setGridColor(Color.blue);
        table.setBackground(Color.white);
        table.setForeground(Color.black);
        table.setRowHeight(70);
        table.setSize(width, heigth);
        table.setFont(font);
        table.setAutoscrolls(rootPaneCheckingEnabled);

        table.getColumnModel().getColumn(0).setPreferredWidth(50);
        table.getColumnModel().getColumn(5).setPreferredWidth(100);
        table.getColumnModel().getColumn(6).setPreferredWidth(100);
        for (int i = 7; i <= 15; i++) {
            table.getColumnModel().getColumn(i).setPreferredWidth(300);
        }
                for (int i = 1; i <5; i++) {
            table.getColumnModel().getColumn(i).setPreferredWidth(200);
        }
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        scrollPane = new JScrollPane();
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setPreferredSize(new Dimension(width, heigth));
        scrollPane.getViewport().add(table, BorderLayout.CENTER);
        getContentPane().add(scrollPane);
        pack();
        setVisible(true);
        for (int i = 7; i <= 15; i++) {
            

            table.getColumn(table.getColumnName(i)).setCellRenderer(
                    new JButtonRenderer());
            table.getColumn(table.getColumnName(i)).setCellEditor(
                    new JButtonEditor(i,table));

        }
        
    }

    class JButtonRenderer implements TableCellRenderer {

        JButton button = new JButton();

        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {
            if (value == null) {
                return null;
            }
            table.setShowGrid(true);
            table.setGridColor(Color.LIGHT_GRAY);
            table.setFont(new Font("DialogInput", Font.BOLD, 20));
            button.setText(value.toString());
            button.setToolTipText("Press " + value.toString());
            button.setFont(new Font("DialogInput", Font.BOLD, 20));
            return button;
        }
        
    }

    class JButtonEditor extends AbstractCellEditor implements TableCellEditor {

        JButton button;
        String txt;

        public JButtonEditor(int column, JTable table) {
            super();
            button = new JButton();
            button.setOpaque(true);
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    int row = table.getSelectedRow();
                    switch (column) {
                        case 7:
                            System.out.println("Reihe 7 Zeile " +row);
                            break;
                        case 8:
                            System.out.println("Reihe 8 Zeile" +row);
                            break;
                        case 9:
                            System.out.println("Reihe 9 Zeile" +row);
                            break;
                        case 10:
                            System.out.println("Reihe 10 Zeile" +row);
                            break;
                        case 11:
                            System.out.println("Reihe 11 Zeile" +row);
                            break;
                        case 12:
                            System.out.println("Reihe 12 Zeile" +row);
                            break;
                        case 13:
                            System.out.println("Reihe 13 Zeile" +row);
                            break;
                        case 14:
                            System.out.println("Reihe 14 Zeile" +row);
                            break;
                        case 15:
                            System.out.println("Reihe 15 Zeile" +row);
                            break;
                        default:
                            System.out.println("Error");
                            break;

                    }
                }
            });
        }

        public Object getCellEditorValue() {
            return null;
        }

        public boolean isCellEditable(EventObject anEvent) {
            return true;
        }

        public boolean shouldSelectCell(EventObject anEvent) {
            return false;
        }

        public boolean stopCellEditing() {
            return super.stopCellEditing();
        }

        public void cancelCellEditing() {
        }

        public void addCellEditorListener(CellEditorListener l) {
        }

        public void removeCellEditorListener(CellEditorListener l) {
        }

        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column) {
            if (value == null) {
                return null;

            }
            txt = (value == null) ? "" : value.toString();
            button.setText(txt);
            return button;
        }
    }
}
 
Ich hänge auch die ganze Zeit schon an einem weiteren Problem fest, mein JTable erstellt fast doppelt so viele Zeilen wie ich überhaupt Einträge in meinem Object Array habe und komme nicht drauf wieso das so ist. Habe beide Varianten (Model und statische) der JTable probiert und bei beiden passiert das gleiche ..
 
Probier mal das hier:

Java:
import java.awt.Component;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class Test {

    static class ButtonCell extends AbstractCellEditor 
            implements TableCellEditor, TableCellRenderer {
        private JButton editor = new JButton();
        private JButton renderer = new JButton();
        private Object value;

        ButtonCell(ActionListener l) {
            editor.addActionListener(e -> {
                fireEditingStopped();
                l.actionPerformed(e);
            });
        } 

        @Override
        public Component getTableCellEditorComponent(JTable table,
                Object value,boolean sel,int row,int col) {
            this.value = value;
            return setValue(value, editor);
        }

        private JButton setValue(Object value, JButton button) {
            String text = value == null ? "" : value.toString();
            button.setText(text);
            return button;
        }

        @Override
        public Component getTableCellRendererComponent(JTable table,
                Object value,boolean sel,boolean focus, int row,int col) {
            return setValue(value, renderer);
        }

        @Override
        public Object getCellEditorValue() {
            return value;
        }
    }

    public void run() {
        String[] columnNames = {"First Name",
                                "Last Name",
                                "Sport",
                                "# of Years",
                                "Enabled"};

        Object[][] data = {
            {"Kathy", "Smith",
             "Snowboarding", new Integer(5), new Boolean(false)},
            {"John", "Doe",
             "Rowing", new Integer(3), new Boolean(true)},
            {"Sue", "Black",
             "Knitting", new Integer(2), new Boolean(false)},
            {"Jane", "White",
             "Speed reading", new Integer(20), new Boolean(true)},
            {"Joe", "Brown",
             "Pool", new Integer(10), new Boolean(false)}
        };        

        JTable table = new JTable(data, columnNames);
        ButtonCell button = new ButtonCell(e -> {
            int ix = table.getSelectedRow();
            if (ix >= 0 && ix < data.length) {
                Object[] row = data[ix];
                JOptionPane.showMessageDialog(table, 
                    ((String) row[0]) + " " + ((String) row[1]));
            }
        });
        table.getColumnModel().getColumn(4).setCellRenderer(button);
        table.getColumnModel().getColumn(4).setCellEditor(button);
        
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(new JScrollPane(table));
        frame.setSize(600, 400);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Ich habe mittlerweile noch etwas weiter gebastelt, und befülle die Tabelle nun dynamisch als TableModel. Ich habe leider nach wie vor das Problem, dass meine Tabelle fast doppelt so viele Zeilen erstellt, wie ich Einträge habe. Habe ungefähr 600 leere Zeilen, und weiß einfach nicht wieso. Jemand eine Idee? o_Oo_O
 
Also laut Debugger hat das Object-Arrays welches ich übergebe eine Länge von 604, genau die Anzahl der Zeilen die ich haben will. Ich kann mir nicht erklären warum er mehr erzeugt..
 
Sorry :D Hier ist er
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableV3 {

    static class ButtonCell extends AbstractCellEditor
            implements TableCellEditor, TableCellRenderer {

        private JButton editor = new JButton();
        private JButton renderer = new JButton();
        private Object value;

        ButtonCell(ActionListener l) {
            editor.addActionListener(e -> {
                fireEditingStopped();
                l.actionPerformed(e);

            });
        }

        @Override
        public Component getTableCellEditorComponent(JTable table,
                Object value, boolean sel, int row, int col) {

            this.value = value;
            return setValue(value, editor);
        }

        private JButton setValue(Object value, JButton button) {
            if (value == null) {
                return null;
            }

            button.setToolTipText("Open Hyperlink to: " + value.toString());
            button.setFont(new Font("DialogInput", Font.BOLD, 20));
            String text = value == null ? "" : value.toString();
            button.setText(text);
            //button.setBackground(Color.black);
            //button.setForeground(Color.white);
            return button;
        }

        @Override
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean sel, boolean focus, int row, int col) {
            table.setShowGrid(true);
            table.setGridColor(Color.BLACK);
            table.setFont(new Font("DialogInput", Font.BOLD, 20));

            return setValue(value, renderer);
        }

        @Override
        public Object getCellEditorValue() {
            return value;
        }
    }

    TableV3(String[] columnNames, String[][] data, int width, int height) {
        TableModel tibco = TibCoModel(columnNames, data);
        JTable tibcotable = new JTable(tibco);

        tibcotable.setSize(width, height);
        tibcotable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>();
        tibcotable.setRowSorter(sorter);
        sorter.setModel(tibco);

        tibcotable.setGridColor(Color.blue);
        tibcotable.setBackground(Color.white);
        tibcotable.setForeground(Color.black);
        tibcotable.setRowHeight(70);

        tibcotable.getColumnModel().getColumn(0).setPreferredWidth(100);
        tibcotable.getColumnModel().getColumn(5).setPreferredWidth(100);
        tibcotable.getColumnModel().getColumn(6).setPreferredWidth(100);
        for (int i = 7; i <= 15; i++) {
            tibcotable.getColumnModel().getColumn(i).setPreferredWidth(300);
        }
        for (int i = 1; i < 5; i++) {
            tibcotable.getColumnModel().getColumn(i).setPreferredWidth(200);
        }

        JScrollPane scrollPane = new JScrollPane(tibcotable);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setPreferredSize(new Dimension(width, height));
        scrollPane.getViewport().add(tibcotable, BorderLayout.CENTER);

        JFrame frame = new JFrame("Tibco-Listener");
        frame.getContentPane().add(scrollPane);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);

        ButtonCell button = new ButtonCell(e -> {
            int ix = tibcotable.getSelectedRow();
            int iy = tibcotable.getSelectedColumn();
            if (ix >= 0 && ix < data.length) {

                switch (iy) {

                    default:
                        System.out.println("Error");
                        break;

                }
            }
        });
        for (int i = 7; i <= 15; i++) {

            tibcotable.getColumnModel().getColumn(i).setCellRenderer(button);
            tibcotable.getColumnModel().getColumn(i).setCellEditor(button);
        }
    }

    private static TableModel TibCoModel(String[] titel, String[][] Tablevalues) {

        DefaultTableModel model = new DefaultTableModel(titel, 0) {
            @Override
            public Class getColumnClass(int column) {
                if (column == 0) {
                    return Integer.class;
                } else {
                    return String.class;
                }
            }
        };

            for (int j = 0; j < Tablevalues.length; j++) {

                Object[] row = {Tablevalues[j][0], Tablevalues[j][1], Tablevalues[j][2], Tablevalues[j][3], Tablevalues[j][4], Tablevalues[j][5], Tablevalues[j][6], Tablevalues[j][7], Tablevalues[j][8], Tablevalues[j][9], Tablevalues[j][10], Tablevalues[j][11], Tablevalues[j][12], Tablevalues[j][13], Tablevalues[j][14], Tablevalues[j][15]};

                model.addRow(row);
            }
            return model;
        }
}
 
Konnte mittlerweile alles lösen. Die erste Spalte bestand bei mir aus Integer Werten, habe sie aber wie alle anderen Einträge als Strings eingelesen, wodurch anscheinend die Berechnung falsch war. Seitdem funktioniert auch das sortieren ordentlich. Vielen Dank für die Hilfe! :)
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben