#spanend
#spanadd
import java.awt.*;
#spanend
#spanadd
import java.awt.event.*;
#spanend
#spanadd
import javax.swing.*;
#spanend
#spanadd
import javax.swing.event.*;
#spanend
#spanadd
import javax.swing.table.*;
#spanend
#spanadd
public class ColumnPreferredWidthTest {
#spanend
String[] columnNames = {"String", "Integer", "Boolean"};
Object[][] data = {
{"aaa", 12, true}, {"bbb", 5, false},
{"CCC", 92, true}, {"DDD", 0, false}
};
DefaultTableModel model = new DefaultTableModel(data, columnNames) {
@Override public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
JTable table = new JTable(model);
TableColumnModel cm = table.getColumnModel();
public JComponent makeUI() {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
int total = cm.getTotalColumnWidth();
int count = cm.getColumnCount();
cm.getColumn(0).setPreferredWidth(100); //0列目の幅を100pxにする
total -= 100;
int colwidth = total / (count - 1); //残りの列幅は均等になるように計算
for (int i = 1; i < count - 1; i++) {
TableColumn col = cm.getColumn(i);
col.setPreferredWidth(colwidth);
total -= colwidth;
}
cm.getColumn(count - 1).setPreferredWidth(total); //最後の列幅で余りを吸収
}
});
#spanadd
#spanend
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(table));
p.add(new JButton(new AbstractAction("print width") {
@Override public void actionPerformed(ActionEvent e) {
for (int i = 0; i < cm.getColumnCount(); i++) {
TableColumn c = cm.getColumn(i);
System.out.println(c.getHeaderValue() + ": " + c.getWidth());
}
}
}), BorderLayout.SOUTH);
return p;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new ColumnPreferredWidthTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
#spanadd
}
#spanend
#spanadd