Link to home
Start Free TrialLog in
Avatar of allelopath
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);

	}

}

Open in new window

Avatar of ksivananth
ksivananth
Flag of United States of America image

that is how it works by default!
Avatar of allelopath
allelopath

ASKER

Not with my code here.
ASKER CERTIFIED SOLUTION
Avatar of ksivananth
ksivananth
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
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?

setting auto resize on, will just ignore the prefered size of the header/column and make the width based on the resize mode.