首先,hier是代码:
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JComponent;
import javax.swing.JButton;
import javax.swing.JToolBar;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableColumn;
@SuppressWarnings("serial")
public class Spielklasse extends JPanel{
private int iEntries = 1;
public Spielklasse(String strTitle){
setLayout(new GridBagLayout());
//dummy to fill vertical space
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 1000;
c.fill = GridBagConstraints.BOTH;
c.weightx=1;
c.weighty=1;
c.gridwidth = 2;
add(new JLabel(" "),c);
}
public void addEntry(JComponent component){
GridBagConstraints c = new GridBagConstraints();
c.anchor = GridBagConstraints.NORTHWEST;
c.gridx = 1;
c.gridy = iEntries;
c.weightx = 1;
c.insets = new Insets(10, 20, 10, 20);
c.fill = GridBagConstraints.HORIZONTAL;
add(component, c);
iEntries++;
}
public static JPanel addExampleTablePanel() {
String[] columnNames = { "first", "second", "third", "fourth", "fifth", "sixth" };
String[][] strArr = new String[100][columnNames.length];
for (int i = 0; i < strArr.length; i++) {
for (int j = 0; j < strArr[0].length; j++) {
strArr[i][j] = i + " xxxxx " + j;
}
}
JTable table = new JTable(strArr, columnNames) {
@Override
public Dimension getPreferredScrollableViewportSize() {
int headerHeight = getTableHeader().getPreferredSize().height;
int height = headerHeight + (10 * getRowHeight());
int width = getPreferredSize().width;
return new Dimension(width, height);
}
};
JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
TableColumn column = null;
for (int i = 0; i < columnNames.length; i++) {
column = table.getColumnModel().getColumn(i);
column.setPreferredWidth(50);
column.setMaxWidth(50);
column.setMinWidth(50);
}
JToolBar toolBar = new JToolBar();
JButton btn = new JButton("test123");
toolBar.add(btn);
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.gridy = 0;
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 1;
c.anchor = GridBagConstraints.LINE_START;
panel.add(toolBar, c);
c.gridy = 1;
panel.add(scrollPane, c);
return panel;
}
public static void main(String[] args) {
Spielklasse mainPanel = new Spielklasse("test");
mainPanel.addEntry(addExampleTablePanel());
mainPanel.addEntry(addExampleTablePanel());
mainPanel.addEntry(addExampleTablePanel());
JFrame frame = new JFrame();
frame.setSize(300, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new JScrollPane(mainPanel));
frame.setVisible(true);
}
}
“Spieklasse”类应创建一个JPanel,其中包含多个不同类型的条目,如表格,文本框等。
在此示例中,应添加3个包含JTable的面板。
这个JTable在JSrollPane中,应该有固定的列宽。 这个JScrollPane位于一个JPanel中,它包含一个Table上方的工具栏来执行某些操作等。 此JPanel被添加到“Spielklasse”类型的主面板中。 主面板位于另一个JScrolLPane内。
以下是问题: - 桌面板应该有一个固定的高度,我可以像我想要的那样设置。在代码示例中,大小已经修复,但我不知道为什么,它的大小也是错误的:-) - 当表格的大小小于表格的大小(所有列在一起)时,应在表格中显示水平滚动条。当框架较大时,每个都应该水平拉伸(已经工作)
我希望我的解释足够好,有人可以帮助我: - )
编辑:更新了camickr,解决了垂直尺寸问题。
答案 0 :(得分:1)
尺寸已经固定,但我不知道为什么以及尺寸错误: - )
滚动窗格的大小由JTable的getPreferredScrollableViewportSize()
方法确定。
创建表时,以下内容在JTable中进行了硬编码:
setPreferredScrollableViewportSize(new Dimension(450, 400));
因此,如果要控制滚动窗格的默认宽度/高度,则需要覆盖getPreferredScrollableViewportSize()
方法以返回合理的值。高度应包括列标题以及要显示的表中的行数。
可能是这样的:
@Override
public Dimension getPreferredScrollableViewportSize()
{
int headerHeight = table.getTableHeader().getPreferredSize().height;
int height = headerHeight + (10 * getRowHeight());
int width = getPreferredSize().width;
return new Dimension(width, height);
}
编辑:
要使用ScrollablePanel,您可以将代码更改为:
//public class Table8 extends JPanel{
public class Table8 extends ScrollablePanel{
private int iEntries = 1;
public Table8(String strTitle){
setLayout(new GridBagLayout());
setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
另一个问题是GridBagLayout。如果没有足够的空间以其首选大小显示组件,则组件捕捉到的最小大小。这会导致滚动窗格出现问题,因此您还需要添加:
scrollPane.setMinimumSize( scrollPane.getPreferredSize() );
或者使用其他布局管理器可能更容易。也许是一个垂直的BoxLayout。