如何在Java Swing应用程序中实现JTable的展开/折叠功能

6
在我的应用程序中,我展示了一个具有大量数据的表格列表。所有表格可能无法适合窗口大小,我们需要滚动才能看到底部的表格。在这里,我需要对表格进行展开/折叠处理。用户可以选择他想查看的所有表格中的哪些表格。这是我的应用程序的样本截图。

enter image description here

我该如何做呢?

5个回答

3
  1. 您可以尝试使用JXTreeTableTreeTable

  2. 或者您可以通过切换jtable的可见性来实现展开/折叠效果。当它可见时,如果用户选择折叠,则使用setVisible(false);,在展开时则相反。[不确定这是否有效。]


对于第二点,它可能有效,这取决于使用的 LayoutManager。一些 LayoutManager 能够处理组件的动态可见性,而其他一些则不能。 - jfpoilpret
@jfpoilpret:是的。这就是为什么我写了“不确定这一点”,因为我们不知道OP正在使用哪种布局管理器。 - Harry Joy

3
public DesignGridTest(){

        JFrame frame = new JFrame("Example 1");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel masterpanel = new JPanel();
        DesignGridLayout masterlayout = new DesignGridLayout(masterpanel);

        JCheckBox chk1 = new JCheckBox("Check Box1");
        masterlayout.row().left().add(chk1);    

        JPanel panel1 = new JPanel();
        JTable table1 = new JTable();
        table1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        panel1.add(table1);
        final IRow row1 = masterlayout.row().grid().add(panel1);
        chk1.setSelected(true);
        chk1.addItemListener(new ItemListener()
        {
            @Override public void itemStateChanged(ItemEvent event)
            {
                if (event.getStateChange() == ItemEvent.SELECTED)
                    row1.show();
                else
                    row1.hide();
                frame.pack();
            }
        });     
        frame.add(masterpanel);
        frame.pack();
        frame.setVisible(true);
    }
    public static void main(String a[]){new DesignGridTest();}

将面板(panel1、panel2等)添加到'masterlayout'中,以获得您想要的外观。

2

2
基于可见性的展开/折叠效果,正如Harry提出的第二个选项,如果使用DesignGridLayout,可以很容易地实现:
DesignGridLayout layout = new DesignGridLayout(panel);
...
JCheckBox expand1 = newCheckBox("First");
layout.row().left().add(expand1);
final IRow row = layout.row().grid().add(table1);
expand.setSelected(true);
expand.addItemListener(new ItemListener()
{
    @Override public void itemStateChanged(ItemIvent event)
    {
        if (event.getStateChanged() == ItemIvent.SELECTED)
            row.show();
        else
            row.hide();
    }
};

将上面的代码(在“...”之后)针对您的panel中的每个表格重复执行。
使用上面的代码,每个标签都会被替换为一个复选框,当取消选择时,它会隐藏下面的表格。
您可以查看DesignGridLayout示例应用程序(在主页上作为WebStart可用)的“动态布局”部分。

2
另一个选择是使用SwingX的JXTaskPane。
  JXTaskPaneContainer container = new JXTaskPaneContainer();
  forEach table:
     JXTaskPane pane = new JXTaskPane(tableTitle);
     pane.add(table);
     container.add(pane);
  somePanel.add(new JScrollPane(container); 

编辑(在代码片段中忘记了任务窗格,还没喝咖啡之前从未发布过;-)


我在哪里可以找到这个JAR文件,并且如何在Netbeans IDE中使用它? - Dyapa Srikanth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接