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
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 ?
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?
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;
}
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.