Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable inside JScrollPane inside JPanel,带GridBagLayout,不';I don’看起来不像它应该的样子_Java_Swing_Jtable_Jscrollpane - Fatal编程技术网

Java JTable inside JScrollPane inside JPanel,带GridBagLayout,不';I don’看起来不像它应该的样子

Java JTable inside JScrollPane inside JPanel,带GridBagLayout,不';I don’看起来不像它应该的样子,java,swing,jtable,jscrollpane,Java,Swing,Jtable,Jscrollpane,首先,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; imp

首先,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);
}

}
导入java.awt.Dimension;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.Insets;
导入javax.swing.JComponent;
导入javax.swing.JButton;
导入javax.swing.JToolBar;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.table.TableColumn;
@抑制警告(“串行”)
公共类Spielklasse扩展了JPanel{
私有整数=1;
公共Spielklasse(字符串符号){
setLayout(新的GridBagLayout());
//填充垂直空间的虚拟对象
GridBagConstraints c=新的GridBagConstraints();
c、 gridx=0;
c、 gridy=1000;
c、 fill=GridBagConstraints.BOTH;
c、 权重x=1;
c、 权重=1;
c、 网格宽度=2;
添加(新的JLabel(“”,c);
}
公共无效补遗(JComponent组件){
GridBagConstraints c=新的GridBagConstraints();
c、 锚点=GridBagConstraints.NORTHWEST;
c、 gridx=1;
c、 gridy=i;
c、 权重x=1;
c、 插图=新插图(10,20,10,20);
c、 填充=GridBagConstraints.HORIZONTAL;
添加(组件c);
iEntries++;
}
公共静态JPanel addExampleTablePanel(){
String[]columnNames={“第一”、“第二”、“第三”、“第四”、“第五”、“第六”};
String[][]strArr=新字符串[100][columnNames.length];
对于(int i=0;i
类“Spieklasse”应该创建一个JPanel,其中包含多个不同类型的条目,如表、文本框等

在此示例中,只应添加3个包含面板的JTable

此JTable位于JSrollPane内,应该具有固定的列宽。 这个JScrollPane位于一个JPanel中,它在表上方包含一个工具栏,用于执行一些操作等。 此JPanel添加到“Spielklasse”类型的主面板中。 主面板位于另一个JScrolLPane内

问题是: -桌子面板应该有一个固定的高度,我可以随意设置。在代码示例中,大小已经固定,但我不知道为什么,它的大小也是错误的:-) -当框架的大小小于表格的大小(所有列加在一起)时,应在表格上显示一个水平滚动条。当框架更大时,所有的东西都应该水平拉伸(已经可以工作了)

我希望我的解释足够好,有人能帮助我:-)

编辑:随着camickr的改进而更新,解决了垂直尺寸问题

尺码已经定了,但我不知道为什么,尺码也不对:-)

滚动窗格的大小由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 );
另一个问题是网格布局。如果没有足够的空间以首选尺寸显示零部件,则零部件将捕捉到最小尺寸。这会导致滚动窗格出现问题,因此您还需要添加:

scrollPane.setMinimumSize( scrollPane.getPreferredSize() );

或者,使用其他布局管理器可能更容易。可能是垂直盒子布局。

您好,非常感谢,这解决了垂直尺寸问题。但横向尺寸仍然不正确。当表格的大小大于框架的大小时,我希望在表格下方显示一个水平滚动条。但是表的水平大小保持为全宽。@user3418986,现在您有一个用于面板的滚动条添加到框架中。如果您建议在每个表上使用单独的滚动条,而不是在面板上,那么我相信您可以使用。您可以将面板配置为“适合”视图