allelopath
asked on
JTable column header width
How do I get column widths to automatically size to the width of the header?
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class MyTable extends JTable {
private DefaultTableModel defaultTableModel;
private Object[][] dataArray;
private Object[] columnNameArray;
private DefaultTableCellRenderer renderer;
/**
* constructor
*
* @param DefaultTableModel
*/
public MyTable(DefaultTableModel defaultTableModel) {
this.setModel(defaultTableModel) ;
renderer = new DefaultTableCellRenderer();
}
/**
* constructor
*
* @param variableNameArray
* @param columnNameArray
*/
public MyTable(Object[][] variableNameArray, Object[] columnNameArray) {
this.dataArray = variableNameArray;
this.columnNameArray = columnNameArray;
defaultTableModel = new DefaultTableModel(variableNameArray, columnNameArray);
this.setModel(defaultTableModel) ;
renderer = new DefaultTableCellRenderer();
}
/**
* alternate shaded/not shaded rows
*/
@Override
public Component prepareRenderer (TableCellRenderer renderer,int Index_row, int Index_col) {
Component component = super.prepareRenderer(renderer, Index_row, Index_col);
// space around border of each cell in table
((JComponent) component).setBorder(BorderFactory.createEmptyBorder(0, 6, 0, 0)); // pxl
//even index, selected or not selected
if (Index_row % 2 == 0 && !isCellSelected(Index_row, Index_col)) {
component.setBackground(Color.lightGray);
component.setForeground(Color.black); // otherwise text disappears
}
else {
component.setBackground(Color.white);
component.setForeground(Color.black); // otherwise text disappears
}
return component;
}
/**
*
* @param args
*/
public static void main(String[] args) {
try{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
}
catch (Exception e){
e.printStackTrace();
}
String[] columnNameArray = {"one" ,
"really wide wide wide",
"three",
"4" ,
"5",
"six six six six",
"7"};
Object[][] dataArray = { };
final MyTable panel = new MyTable(dataArray, columnNameArray);
final JFrame frame = new JFrame();
frame.getContentPane().add(new JScrollPane(panel));
frame.setTitle("My Table");
frame.setPreferredSize(new Dimension(500, 500));
frame.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
}
});
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLocation(300, 200);
frame.pack();
frame.setVisible(true);
}
}
that is how it works by default!
ASKER
Not with my code here.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Turning off auto resize and then explicitly setting widths like that works.
But if auto resize is on by default, why isn't it working here?
But if auto resize is on by default, why isn't it working here?
>>But if auto resize is on by default, why isn't it working here?
setting auto resize on, will just ignore the prefered size of the header/column and make the width based on the resize mode.
setting auto resize on, will just ignore the prefered size of the header/column and make the width based on the resize mode.