对于以下代码,我无法将列大小设置为自定义大小。为什么会这样?还没有显示第一列。
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableColumn;
public class Trial extends JFrame{
public void create(){
JPanel jp = new JPanel();
String[] string = {" ", "A"};
Object[][] data = {{"A", "0"},{"B", "3"},{"C","5"},{"D","-"}};
JTable table = new JTable(data, string);
jp.setLayout(new GridLayout(2,0));
jp.add(table);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
TableColumn column = null;
for (int i = 0; i < 2; i++) {
column = table.getColumnModel().getColumn(i);
column.setPreferredWidth(20); //custom size
}
setLayout(new BorderLayout());
add(jp);
}
public static void main(String [] a){
Trial trial = new Trial();
trial.setSize(300,300);
trial.setVisible(true);
trial.setDefaultCloseOperation(Trial.EXIT_ON_CLOSE);
trial.create();
}
}
答案 0 :(得分:3)
你在这里遇到了几个问题。首先,始终从Swing EDT初始化您的JFrame:
public static void main(String[] a) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Trial trial = new Trial();
trial.setSize(300, 300);
trial.setDefaultCloseOperation(Trial.EXIT_ON_CLOSE);
trial.create();
}
});
}
如果不这样做会导致细微的错误。第二:JTable喜欢存在于JScrollPanes中。这就是你没有看到列标题的原因:
JScrollPane pane = new JScrollPane();
pane.setViewportView(table);
jp.add(pane);
完成上述操作后,我会看到每个20像素宽的小小柱。
答案 1 :(得分:2)
当自动调整大小模式设置为关闭时,在布置表格时,根本不会调整列宽。来自JTable的doLayout()文档:
AUTO_RESIZE_OFF:不自动 根本调整列的宽度。使用 一个水平滚动条,以容纳 当它们的总和超过时的列 视口的宽度。 如果是JTable 没有包含在JScrollPane中 可能会留下部分表格 不可见的。强>
尝试将JTable
添加到JScrollPane
,然后将其添加到面板。