当前位置: 首页 > 知识库问答 >
问题:

JTable位于带有GridBagLayout的JPanel内部

端木野
2023-03-14
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);
}

}

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

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

共有1个答案

颛孙正卿
2023-03-14

尺寸已经固定,但我不知道为什么,而且尺寸也不对:-)

滚动窗格的大小由JTable的getPreferredScrollabLeviewPortSize()方法确定。

创建表时,JTABLE中的硬编码如下:

setPreferredScrollableViewportSize(new Dimension(450, 400));
@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() );

或者使用另一个布局管理器可能更容易。也许是垂直的盒子布局。

 类似资料:
  • 任何帮助都是非常感谢的!

  • 我有一个JFrame,它被设置为大小为NxN的GridLayout。N由用户在程序开始时作为命令行给出。NxN模式中的JButton被添加到JPanels中的窗口中,由GridLayout(我认为)在位置中设置。 每个JButton是否需要自己的JPanel来使用GridLayout?我的印象是,您可以为所有按钮设置一个JPanel,并将JPanel设置为JButtons的GridLayout。我

  • 你好,我实际上正在尝试从jPanel切换到我的JFrame中的另一个jPanel。我已经更改了我的代码,下面是我遵循以下内容的样子:

  • 我试图在JTable的某个列中放置一个JComboBox。我有这个代码,它正在工作: 我的问题是,在选中该列中的一个单元格之前,它不会显示为JComboBox。加载JFrame时,整个表看起来都一样,好像所有单元格中只有文本。单击时,它会显示组合框的箭头和选项,但再次取消选择时,它看起来像一个常规单元格。 有办法绕过它吗?

  • 下面的示例介绍了以下应用程序: 位于BorderLayout北边的按钮会将带有一些组件的GridBagLayout面板添加到BoxLayout中。Y_AXIS在BorderLayout中。CENTER。但是单击按钮后,面板会显示在中心,而不是添加到顶部。 播放锚()将单选按钮和一个标签设置到顶部,但第二个标签仍显示在中间。 如何让面板出现在顶部而不是中心?

  • 我有一个,名为,布局设置为。在面板内部有三个,分别添加到、和。现在,我的要求是,如果单击Settings按钮,它将在上方显示一个透明的。这个透明的面板将包含一个不透明的,更小的,居中的面板,其中将包含设置的东西。 我知道我可以使用来实现这一点,但是查看教程,它说您只能使用绝对定位来放置不同深度的组件,我知道这是非常不鼓励的。 是否有其他方法可以做到这一点,而不使用绝对定位?