table.getPreferredSize()
代わりに使用する必要があると思います。次のコード スニペットを試してください。
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class Tests {
private void initGUI(){
Object[] tableHeader = new Object[]{"Name", "Category", "Color","Ranking"};
DefaultTableModel dftm = new DefaultTableModel(tableHeader, 0);
dftm.addRow(new Object[]{"Watermelon","Fruit","Green and red",3});
dftm.addRow(new Object[]{"Tomato","Vegetable","Red",5});
dftm.addRow(new Object[]{"Carrot","Vegetable","Orange",2});
JTable table = new JTable(dftm);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setViewportView(table);
Dimension tableSize = table.getPreferredSize();
table.getColumn("Name").setPreferredWidth(100);
table.getColumn("Category").setPreferredWidth(150);
table.getColumn("Color").setPreferredWidth(Math.round((tableSize.width - 250)* 0.70f));
table.getColumn("Ranking").setPreferredWidth(Math.round((tableSize.width - 250)* 0.30f));
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(scrollPane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Tests().initGUI();
}
});
}
}
ご覧のとおり、Name
列の幅は 100、Category
幅は 150 になり、Color
列は残りの幅の 70% でRanking
収まり、最後に 30% で収まります。
アップデート
このコメントに基づいて:
ありがとう、しかし、JFrameのサイズがJTableよりも明示的に大きく設定されている場合、これは機能しません...
setMinWidth
解決策は、静的な列の幅を修正する方法で遊ぶことも、独自のTableColumnModelListenersetMaxWidth
を実装することもできます。上記の例では、行を次のように置き換えて、必要に応じてフレームの優先サイズを設定してみてください。setPreferredWith
final JTable table = new JTable(dftm);
table.getColumnModel().addColumnModelListener(new TableColumnModelListener() {
@Override
public void columnAdded(TableColumnModelEvent e) {
table.columnAdded(e);
}
@Override
public void columnRemoved(TableColumnModelEvent e) {
table.columnRemoved(e);
}
@Override
public void columnMoved(TableColumnModelEvent e) {
table.columnMoved(e);
}
@Override
public void columnMarginChanged(ChangeEvent e) {
Dimension tableSize = table.getSize();
table.getColumn("Name").setWidth(100);
table.getColumn("Category").setWidth(150);
table.getColumn("Color").setWidth(Math.round((tableSize.width - 250)* 0.70f));
table.getColumn("Ranking").setWidth(Math.round((tableSize.width - 250)* 0.30f));
}
@Override
public void columnSelectionChanged(ListSelectionEvent e) {
table.columnSelectionChanged(e);
}
});