Avatar billede acidduck Nybegynder
19. januar 2005 - 10:01 Der er 8 kommentarer og
1 løsning

Vandret scrollende JTabel

Jeg har et JTabel med tre kolonner. JTablet er sat ind i et JScrollPane.

Det er fint at JTable automatisk tilpasser kolonnebredderne når jeg gør vinduet mindre, men jeg ønsker at vandret scrolling gøres aktiv når JTablet gøres mindre end fx. 200pixels i bredden (da kolonnebredderne så er så små at ingenting er læseligt).

Hvordan gør jeg det?
Avatar billede mikkelbm Nybegynder
19. januar 2005 - 10:33 #1
Prøv med:

table.setMinimumSize (new Dimension (200, 10));

eller

table.setPreferredSize (new Dimension (200, 10));
Avatar billede acidduck Nybegynder
19. januar 2005 - 10:38 #2
Det har jeg allerede prøvet. Jeg har fundet ud af at begrænse størrelsen som jeg ønsker således:

TableColumn column = table.getColumnModel().getColumn(0)
column.setMinWidth(80);

Det gør jeg for hver kolonne. Problemet er bare at når jeg gør vinduet mindre end minimum bredderne så aktiveres den lodrette scroll ikke. Dvs. vinduet "æder" bare af tablet.
Avatar billede di8leva Nybegynder
19. januar 2005 - 10:43 #3
Hvis du bruger:
----------------------
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
----------------------
Så aktiveres din scroll. Problemet er isstedet at dine kolonner ikke fylder ud tabellen hvis den bliver rigtigt stor.

Du kan prøve de forskellige AUTO_RESIZE...
Avatar billede mikkelbm Nybegynder
19. januar 2005 - 10:43 #4
Så må du jo sætte en minimum på rows også - jeg troede egentlig at en af setsize metoderne kunne gøre det.
Det har før virket for mig.
Avatar billede di8leva Nybegynder
19. januar 2005 - 10:52 #5
mikkelbm -> Nej, rows behøver ikke någon størrelse, hvis du ikke vil ha dem forskellige fra defaultstørrelsen
Avatar billede acidduck Nybegynder
19. januar 2005 - 10:56 #6
di8leva -> AUTO_RESIZE_OFF ønsker jeg netop ikke. Jeg ønsker jo at tabellen skalerer korrekt når vinduet gøres større. De andre muligheder virker desværre hellerikke.
Avatar billede _carsten Nybegynder
19. januar 2005 - 15:06 #7
Jeg ser ikke rigtig nogen anden løsning, end at adde en componentListener til dit scrollpane og så styre kolonnebredden derfra.

Se eksempel.


import javax.swing.JScrollBar;
import javax.swing.JViewport;
import javax.swing.table.TableColumn;

public class TblTest extends javax.swing.JFrame {
   
    public TblTest() {
        initComponents();
        view = scroll.getViewport();
        columns = table.getColumnCount();
        defaultWidth = (int)(minColumnWidth * columns);
    }
   

    private void initComponents() {
        scroll = new javax.swing.JScrollPane();
        table = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        scroll.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroll.addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentResized(java.awt.event.ComponentEvent evt) {
                resize(evt);
            }
        });

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

        TableColumn col;
        for(int i = 0; i < table.getColumnCount(); i++){
            col = table.getColumnModel().getColumn(i);
            col.setMinWidth(minColumnWidth);
        }
        scroll.setViewportView(table);

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

        pack();
    }

    private void resize(java.awt.event.ComponentEvent evt) {
        if ( view.getWidth() > defaultWidth){
            int diff = (view.getWidth() - defaultWidth) / columns;
            TableColumn col;
            for(int i = 0; i < table.getColumnCount(); i++){
                col = table.getColumnModel().getColumn(i);
                col.setMinWidth(minColumnWidth + diff);
                col.setPreferredWidth(minColumnWidth + diff);
            }
        }
        else{
            TableColumn col;
            for(int i = 0; i < table.getColumnCount(); i++){
                col = table.getColumnModel().getColumn(i);
                col.setMinWidth(minColumnWidth);
                col.setPreferredWidth(minColumnWidth);
            }
        }
    }
   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TblTest().setVisible(true);
            }
        });
    }
   
    private javax.swing.JScrollPane scroll;
    private javax.swing.JTable table;
    private int minColumnWidth = 125;
    private int columns, defaultWidth;
    private JViewport view;
}
Avatar billede acidduck Nybegynder
20. januar 2005 - 14:39 #8
carsten -> den løsning vil jeg godt give point for.
Avatar billede _carsten Nybegynder
20. januar 2005 - 15:08 #9
Så vil jeg da give dig mulighed for det - et svar.
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