getSelectedRow() springt bei JButton-Auswahl nicht weiter mit

Corvin697

Mitglied
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

  • Unbenannt.png
    Unbenannt.png
    29,5 KB · Aufrufe: 53

mihe7

Top Contributor
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?
 

Corvin697

Mitglied
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;
        }
    }
}
 

Corvin697

Mitglied
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 ..
 

mihe7

Top Contributor
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());
    }
}
 

Corvin697

Mitglied
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
 

Corvin697

Mitglied
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..
 

Corvin697

Mitglied
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;
        }
}
 

Corvin697

Mitglied
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! :)
 

Corvin697

Mitglied
Ich bin nun auf ein weiteres Problem gestoßen. Ich habe in meiner Tabelle doppelte Einträge und bräuchte mal einen Denkanstoß wie ich die angelegten Rows auf Doppeltes Vorhanden überprüfen könnte. Danke schonmal im Voraus :)
Java:
    private static TableModel TibCoModel(int []zeilen, 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 = {zeilen[j], 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]};
                
              
                if ( zeilen[j] != 0 ) {
                    model.addRow(row);
                }
            }
            return model;
        }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G HILFE Dringend switch case springt nicht raus Frameworks - Spring, Play, Blade, Vaadin & Co 23
L Mauszeiger springt in obere linke Ecke des JDialogs Frameworks - Spring, Play, Blade, Vaadin & Co 3
D Button springt aus Textbox Frameworks - Spring, Play, Blade, Vaadin & Co 2
A Debugger springt in andere Klassen Frameworks - Spring, Play, Blade, Vaadin & Co 14
K Figur Springt nicht Frameworks - Spring, Play, Blade, Vaadin & Co 2
S Zeitmessung springt vorraus und funktioniert nicht! Frameworks - Spring, Play, Blade, Vaadin & Co 4
P Spieler im 2D-Spiel springt herum Frameworks - Spring, Play, Blade, Vaadin & Co 0
G JTable springt (JScrollPane, GridBagLayout) Frameworks - Spring, Play, Blade, Vaadin & Co 1
K TextWatcher springt nicht an Frameworks - Spring, Play, Blade, Vaadin & Co 9
T JTable + JScrollePane Größe "springt" beim resizen des Fensters Frameworks - Spring, Play, Blade, Vaadin & Co 4
engelsteufelin Taschenrechner springt an Start nach falscher Eingabe Frameworks - Spring, Play, Blade, Vaadin & Co 7
W Java Applet aus der Taskleiste springt in Vordergrund Frameworks - Spring, Play, Blade, Vaadin & Co 3
O Progressbar 'springt nicht an' Frameworks - Spring, Play, Blade, Vaadin & Co 5
B Exception springt nicht in den catch- Block Frameworks - Spring, Play, Blade, Vaadin & Co 14
R Programm springt nicht in if Bedingung Frameworks - Spring, Play, Blade, Vaadin & Co 9
F Debugging springt nicht in Methode - liefert null Frameworks - Spring, Play, Blade, Vaadin & Co 2
C LWUIT: Scrollen der Form springt am Ende Frameworks - Spring, Play, Blade, Vaadin & Co 0
Haave Animation "springt" trotz Wartebefehl Frameworks - Spring, Play, Blade, Vaadin & Co 3
J Eclipse springt nicht mehr an. Frameworks - Spring, Play, Blade, Vaadin & Co 8
nrg Debugger springt immer in Java SE Code Frameworks - Spring, Play, Blade, Vaadin & Co 3
D Methode springt zwischen returns Frameworks - Spring, Play, Blade, Vaadin & Co 2
Balbes JComboBox springt af den ersten Wert zurück Frameworks - Spring, Play, Blade, Vaadin & Co 6
Z JList "springt" Frameworks - Spring, Play, Blade, Vaadin & Co 5

Ähnliche Java Themen

Neue Themen


Oben