Avatar billede ng-km Nybegynder
05. august 2003 - 12:53 Der er 4 kommentarer og
1 løsning

Automatisk scroll på JTable

Jeg har lavet en tabel (JTable), og fyldt den med data. Brugeren kan sortere de enkelte rækker ved at trykke på TableHeaderens overskrifter, og ud fra nogle kriterier findes den række der er tættest på det brugeren ønsker. Når jeg har fundet rækken, afmærker jeg den med
minTabel.setRowSelectionInterval(int, int), og det hele virker fint.

MEN som oftest er resultatet længere nede i tabellen end det er muligt at vise direkte, og brugeren må derfor selv scrolle ned til det afmærkede resultat for at se det. Er der ikke mulighed for automatisk at få scrollet det afmærkede resultat op eller ned så det er synligt uden at brugeren selv skal scrolle hen til det? Hvordan gøres det nemmest hvis man kan?
Avatar billede _carsten Nybegynder
05. august 2003 - 20:25 #1
Det kan lade sig gøre, men er lidt tricky.

Jeg har lavet et lille eksempel, så kan du pille det ud, som du skal
bruge

Brug knapperne og tilføj nogle hunderede rækker og prøv det

import javax.swing.*;
/**
*
* @author  Carsten Hansen
*/
public class ScrollToRow extends javax.swing.JFrame {
   

    public ScrollToRow() {
        initComponents();
    }
   

    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jButton3 = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jPanel1.setLayout(new java.awt.BorderLayout());

        jButton3.setText("<html>Definer hvilken<br>r\u00e6kke der<br>skal afm\u00e6rkes,<br>og scroll<br>til r\u00e6kken</html>");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                myChoice(evt);
            }
        });

        jPanel1.add(jButton3, java.awt.BorderLayout.CENTER);

        jButton4.setText("Tilf\u00f8j r\u00e6kker");
        jButton4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addTableRows(evt);
            }
        });

        jPanel1.add(jButton4, java.awt.BorderLayout.NORTH);

        getContentPane().add(jPanel1, java.awt.BorderLayout.WEST);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(jTable1);

        getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);

        pack();
    }

    private void addTableRows(java.awt.event.ActionEvent evt) {
        javax.swing.table.DefaultTableModel model;
        model = (javax.swing.table.DefaultTableModel)jTable1.getModel();
       
        Object[] rowData = new Object[]{null,null,null,null};
        String s = JOptionPane.showInputDialog(this,"Skriv antal rækker som skal tilføjes");
        int i = Integer.parseInt(s);
       
        for(int x = 0; x < i; x++){
            model.addRow(rowData);
        }
    }


    // DET ER HER DET SKER
    private void myChoice(java.awt.event.ActionEvent evt) {
        String s = JOptionPane.showInputDialog(this,"Hvilken række skal vælges");
        int i = Integer.parseInt(s);
        if(i <= jTable1.getRowCount()){
            jTable1.setRowSelectionInterval(i, i);
       
            java.awt.Rectangle rect = jScrollPane1.getViewportBorderBounds();
            double h = rect.getHeight();
            int move = jTable1.getSelectedRow() * jTable1.getRowHeight() - (int)h + jTable1.getRowHeight();
            scroll = jScrollPane1.getVerticalScrollBar();
            scroll.setValue(move);
        }
    }
   

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   
    public static void main(String args[]) {
        new ScrollToRow().show();
    }
   
   
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    private JViewport view = new JViewport();
    private JScrollBar scroll = new JScrollBar();
}
Avatar billede _carsten Nybegynder
05. august 2003 - 20:33 #2
Forresten - hvis den valgte række skal vises øverst i dit scrollpane
så ret følgende i metoden myChoice()

// RET TIL NEDENSTÅENDE
int move = jTable1.getSelectedRow() * jTable1.getRowHeight();
Avatar billede ng-km Nybegynder
06. august 2003 - 12:28 #3
_carsten ->

Tak for hjælpen, det var lidt mere tricky end jeg havde troet, så du får 60 point i stedet for 30.

ng-km
Avatar billede _carsten Nybegynder
06. august 2003 - 22:20 #4
OK - det siger jeg selvfølgelig tak for!!

Men det var nu ikke nødvendigt, hvis jeg mente 30 point var for
lidt, havde jeg nok ikke svaret - men jeg skulle selv bruge det
til en anden opgave, så jeg fremskyndede det bare og det lykkedes jo.

Carsten
Avatar billede feynor Nybegynder
27. april 2005 - 09:36 #5
Er dette ikke lidt lettere end selv at skulle forsøge at regne positionen ud ?

jTable1.scrollRectToVisible(jTable1.getCellRect(jTable1.getSelectedRow(),
                            jTable1.getSelectedColumn(), true));
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester