Avatar billede nzc Nybegynder
29. oktober 2003 - 14:20 Der er 7 kommentarer og
1 løsning

kolonner og bredde af disse i en jTable

Hej!

jeg har en jTable med en række kolonner i. Disse kolonner skal have en bredde der passer til den String der står i headeren. Jeg har prøvet med sizeWidthToFit() men ku ikke få den til at virke (manglede et eller andet med TableHeaders som jeg ikke fattede) derefter prøvede jeg med doLayout() som API'en selv foreslår men det virkede heller ikke :(
Altså hvordan får jeg bredde af mine kolonner til at passe med det der står i headeren?

Når dette problem er løst kommer et nyt frem :) Jeg har nemlig min jTable inde i en JScrollPane og denne JScrollPane skulle gerne være ligeså bred som tabellen. Hvordan fikser jeg dette?

On forhand fanx

NZC
Avatar billede aslan Nybegynder
29. oktober 2003 - 14:41 #1
Det første:

        TableColumn taeller = tabel.getColumnModel().getColumn(0);
        taeller.setPreferredWidth(10);
Avatar billede aslan Nybegynder
29. oktober 2003 - 14:42 #2
Nr 2 kan jeg ikke forstå, har du brugt null layout siden JScrollPane ikke tilpasser sig Jtable?
Avatar billede nzc Nybegynder
29. oktober 2003 - 14:51 #3
den første:

setPreferredWidth() er jo ikke dynamisk og kan ikke bruges til det jeg vil. Jeg vil jo ha at bredden skal tilpasse sig efter headeren.

Den anden:

YE jeg har null layout :/ Kan det så ikke virke hvis man bruger det ?
Avatar billede aslan Nybegynder
29. oktober 2003 - 15:39 #4
Prøv at lade vær med at sætte størrelse på tabel så, men sæt størrelse på JScrollPane efter at have smidt tabel i den...

øhh angående de headers... nu har jeg brugt JTable rigtig meget og har aldrig været ud for at jeg havde brug for at lave om på dem?
Avatar billede _carsten Nybegynder
29. oktober 2003 - 22:15 #5
Jeg har ikke lige studeret om der er en nemmere måde, men nedenstående gør
hvad du ber om.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.table.*;
import java.awt.font.*;

public class Table extends JFrame {

    public Table() {
        initComponents();
        setSize(250,250);
        setColumnSize();

    }

    private void initComponents() {
        jPanel1 = new JPanel();
        jScrollPane1 = new JScrollPane();
        jTable1 = new JTable();

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                exitForm(evt);
            }
        });

        jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        jScrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        jTable1.setModel(new DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null}
            },
            new String [] {
                "A", "AB", "ABC", "ABCD", "ABCDE"
            }
        ));
        jTable1.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        jTable1.setPreferredScrollableViewportSize(new Dimension(10, 10));
        jScrollPane1.setViewportView(jTable1);

        jPanel1.add(jScrollPane1);

        getContentPane().add(jPanel1, BorderLayout.CENTER);

        pack();
    }

    private void exitForm(WindowEvent evt) {
        System.exit(0);
    }


    public static void main(String args[]) {
        new Table().show();
    }


    private int doTableStuff(int col){
        String text = jTable1.getColumnName(col);

        fonte = header.getFont();
        g = header.getGraphics();

        g2 = (Graphics2D)g;
        g2.setFont(fonte);
        context = g2.getFontRenderContext();
        layout = new TextLayout(text, fonte, context);
        return (int)layout.getAdvance();
    }


    private void setColumnSize(){
        header = jTable1.getTableHeader();
        javax.swing.table.TableColumn column = null;

        int width = 0;
        for(int i = 0; i < jTable1.getColumnCount(); i++){
            column = jTable1.getColumnModel().getColumn(i);
            int x = doTableStuff(i) + 4;
            column.setPreferredWidth( x );
            width += x;
        }
        setScrollPaneSize(width);
    }

    private void setScrollPaneSize(int width){
        javax.swing.JScrollBar scrollBar = jScrollPane1.getVerticalScrollBar();
        java.awt.Insets insets = jScrollPane1.getInsets();
        int left = insets.left;
        int right = insets.right;
        int totalWidth =  width + left + right;
        jTable1.setPreferredScrollableViewportSize(new Dimension(totalWidth, 50));
    }


    private JPanel jPanel1;
    private JScrollPane jScrollPane1;
    private JTable jTable1;
    private Graphics g;
    private Graphics2D g2;
    private TextLayout layout = null;
    private FontRenderContext context;
    private Font fonte;
    private JTableHeader header;
}
Avatar billede nzc Nybegynder
30. oktober 2003 - 09:15 #6
tja du har jo ret i den gør det jeg ber om men der må jo være en funktion eller noget der er MEGET nemmere.

doLayout() eller noget burde da virke eller sizeWidthToFit()

NZC
Avatar billede _carsten Nybegynder
30. oktober 2003 - 11:02 #7
Selvfølgelig virker sizeWidthToFit(), men den kræver at din header renderer
ikke er null, da default er null, skal du altså selv strikke noget sammen,
om det er MEGET nemmere ved jeg ikke, men du kan da arbejde lidt med det.
Avatar billede _carsten Nybegynder
02. december 2003 - 20:36 #8
Har du fået det til virke ????????
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