如何在Java swing应用程序中实现JTables的展开/折叠特性

bbmckpt7  于 2022-11-20  发布在  Java
关注(0)|答案(5)|浏览(414)

在我的应用程序中,我显示了一个包含大量数据的表列表。所有的表可能都不适合窗口,我们需要滚动以查看底部的表。在这里,我需要展开/折叠表。用户可以选择他想在所有表中查看的表。这是我的应用程序的示例屏幕截图。

我该怎么做?

flvlnr44

flvlnr441#

1.您可以尝试JXTreeTableTreeTable
1.或者您可以切换jtable的可见性以产生展开/折叠效果。首先,当它可见时,使用select collapse,使用setVisible(false);,然后在expand中执行相反的操作。[不确定这是否有效。]

mbyulnm0

mbyulnm02#

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 ..)添加到“主布局”以获得所需的外观

xytpbqjk

xytpbqjk3#

org.netbeans.swing.outline.Outline是一个很有吸引力的替代方案,如本文和here所述。

cx6n0qe3

cx6n0qe34#

如果使用DesignGridLayout,可以很容易地实现Harry提出的基于可见性的展开/折叠效果(作为第二个选项):

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形式提供)。

h6my8fg2

h6my8fg25#

另一种选择是使用SwingX的JXTaskPane

JXTaskPaneContainer container = new JXTaskPaneContainer();
  forEach table:
     JXTaskPane pane = new JXTaskPane(tableTitle);
     pane.add(table);
     container.add(pane);
  somePanel.add(new JScrollPane(container);

已编辑(忘记了taskPane中的代码片段,从不发布before-coffee ;- )

相关问题