我有一个超级基本的JTable
,我把它添加到一个JFrame
中,但是由于某种原因frame.pack()
不起作用。我把行高设置为列宽,这样表格的单元格就成了正方形,但是当窗口调整大小时,这个方法似乎不起作用。那么,我怎样才能使表格的单元格总是正方形,即使调整大小也是如此呢?并且框架 Package 正确吗?下面是窗口的代码:
package me.an.ar.window;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
public class DayPlanner
{
private JFrame frame;
private void createAndShowGUI()
{
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container container = frame.getContentPane();
Object[][] data = new Object[5][7];
String[] columnNames = { "Day1", "Day2", "Day3", "Day4", "Day5", "Day6", "Day7" };
JTable table = new JTable(data, columnNames);
for (int col = 0; col < table.getColumnCount(); col++)
{
for (int row = 0; row < table.getRowCount(); row++)
{
int colWidth = table.getColumnModel().getColumn(col).getWidth();
table.setRowHeight(row, colWidth);
}
}
container.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private void show()
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
public DayPlanner()
{
show();
}
public static void main(String[] args)
{
new DayPlanner();
}
}
2条答案
按热度按时间uxhixvfz1#
您未设置任何LayoutManager。默认值不是FlowLayout,但至少不能为null:
这意味着通过调整窗口的大小,你将不得不更多地与滚动窗格的大小作斗争。
这将使滚动窗格随框架增长和收缩,表中的行数/列数可能会发生变化,这也可能会受到JTable.setAutoResizeMode()的影响。
jutyujz02#
选项1
您还没有真正提到您将如何使用这个表(将保存哪些数据以及用户期望如何与之交互);然而,这听起来像是
GridLayout
(关于数据单元格)以及GridBagLayout
(关于标头单元格)的用例。选项2
如果您仍然希望使用问题中给出的
JTable
,可以在JFrame
中添加一个ComponentListener,这样您就可以监听"resize事件",从而允许您重新调整单元格的大小并保留其方形形状。至于
pack()
的问题,你可以根据表格中的行和列来设置JFrame
的初始大小(记住注解掉frame.pack();
).下面的代码,虽然它会删除框架底部的空白区域,但是它不会阻止用户重新调整窗口大小并将其恢复。