Java 仅当Jpanel大小已满时显示Jtable滚动条

Java 仅当Jpanel大小已满时显示Jtable滚动条,java,swing,jtable,jpanel,jscrollpane,Java,Swing,Jtable,Jpanel,Jscrollpane,我无法继续执行table.setPreferredScrollableViewportSize(table.getPreferredSize()),每次添加新行时,滚动条将不会按照以下规则显示: There are three panels inside a JFrame. 1. Parent panel (Using GridBaglayout) i. Table panel 1 containing JTable (Using normal Border

我无法继续执行table.setPreferredScrollableViewportSize(table.getPreferredSize()),每次添加新行时,滚动条将不会按照以下规则显示:

    There are three panels inside a JFrame.

     1. Parent panel (Using GridBaglayout)
        i. Table panel 1 containing JTable (Using normal Border layout) & JScrollPane
        ii.Button panel 2 containing "Add Row" and "Delete Row" button. (Using flow layout)

    Requirements:

     1. Add row and delete row buttons should add and delete table rows respectively.
     2. The panel 1 size should increase/decrease with addition and deletion of rows. For this I have used: table.setPreferredScrollableViewportSize(table.getPreferredSize());

     3. Scroll bars should appear only when panel 1 + panel 2 fills up the parent panel
需要帮助才能找到何时停止执行table.setPreferredScrollableViewportSize(table.getPreferredSize())的条件,或者是否有其他方法来满足上述要求

Vertical scroll bar appear only when the component size (in this context, table) becomes larger than the view port size. 

如果希望视口获得合理的高度(与初始行数无关) 您可以从更改初始化

    package practice;

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;

    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    import javax.swing.table.DefaultTableModel;

    public class TableExample3 {

        private DefaultTableModel tableModel;

        public void createAndShowGui() {
            JFrame frame = new JFrame("Table size test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JPanel panel = new JPanel(new GridBagLayout());

            JPanel tablepanel = new JPanel(new BorderLayout());
            JTable table = new JTable(4, 4);
            table.setFillsViewportHeight(false);
            tableModel = (DefaultTableModel) table.getModel();
            JScrollPane pane = new JScrollPane(table);
            tablepanel.add(pane);

            GridBagConstraints gc = new GridBagConstraints();
            gc.fill = GridBagConstraints.HORIZONTAL;
            gc.gridx = 0;
            gc.gridy = 0;
            gc.weightx = 1;
            panel.add(tablepanel, gc);

            JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
            buttonPanel.setBorder(BorderFactory.createEtchedBorder());
            JButton addButton = new JButton("Add");
            JButton deleteButton = new JButton("Delete");
            buttonPanel.add(addButton);
            buttonPanel.add(deleteButton);

            table.setPreferredScrollableViewportSize(table.getPreferredSize());

            Object[] data = null;
            addButton.addActionListener((evt) -> {

                tableModel.addRow(data);

                // if (has to be some condition here when tablepanel + buttonPanel
                // fills up the panel) {

                table.setPreferredScrollableViewportSize(table.getPreferredSize());

                panel.revalidate();
                panel.repaint();
            });

            deleteButton.addActionListener((evt) -> {
                int rowCount = tableModel.getRowCount();
                tableModel.removeRow(rowCount - 1);
                pane.getViewport().setPreferredSize(table.getPreferredSize());
                panel.revalidate();
                panel.repaint();

            });

            gc.gridy = 1;
            gc.weighty = 1;
            gc.anchor = GridBagConstraints.NORTH;

            panel.add(buttonPanel, gc);

            frame.getContentPane().add(panel);
            frame.setVisible(true);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

        }

        public static void main(String... args) {
            TableExample3 example = new TableExample3();
            SwingUtilities.invokeLater(() -> example.createAndShowGui());
        }
    }
差不多

table.setPreferredScrollableViewportSize(table.getPreferredSize());
但最重要的是,在“添加”和“删除”的操作处理程序中
setPreferredSize
setPreferredViewportSize
revalidate
repaint
, 因为它弊大于利

Dimension preferredTableSize = table.getPreferredSize();
preferredTableSize.height = 100;
table.setPreferredScrollableViewportSize(preferredTableSize);

然后,滚动条将根据需要显示和消失。

如果希望视口获得合理的高度(与初始行数无关) 您可以从更改初始化

    package practice;

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;

    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    import javax.swing.table.DefaultTableModel;

    public class TableExample3 {

        private DefaultTableModel tableModel;

        public void createAndShowGui() {
            JFrame frame = new JFrame("Table size test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JPanel panel = new JPanel(new GridBagLayout());

            JPanel tablepanel = new JPanel(new BorderLayout());
            JTable table = new JTable(4, 4);
            table.setFillsViewportHeight(false);
            tableModel = (DefaultTableModel) table.getModel();
            JScrollPane pane = new JScrollPane(table);
            tablepanel.add(pane);

            GridBagConstraints gc = new GridBagConstraints();
            gc.fill = GridBagConstraints.HORIZONTAL;
            gc.gridx = 0;
            gc.gridy = 0;
            gc.weightx = 1;
            panel.add(tablepanel, gc);

            JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
            buttonPanel.setBorder(BorderFactory.createEtchedBorder());
            JButton addButton = new JButton("Add");
            JButton deleteButton = new JButton("Delete");
            buttonPanel.add(addButton);
            buttonPanel.add(deleteButton);

            table.setPreferredScrollableViewportSize(table.getPreferredSize());

            Object[] data = null;
            addButton.addActionListener((evt) -> {

                tableModel.addRow(data);

                // if (has to be some condition here when tablepanel + buttonPanel
                // fills up the panel) {

                table.setPreferredScrollableViewportSize(table.getPreferredSize());

                panel.revalidate();
                panel.repaint();
            });

            deleteButton.addActionListener((evt) -> {
                int rowCount = tableModel.getRowCount();
                tableModel.removeRow(rowCount - 1);
                pane.getViewport().setPreferredSize(table.getPreferredSize());
                panel.revalidate();
                panel.repaint();

            });

            gc.gridy = 1;
            gc.weighty = 1;
            gc.anchor = GridBagConstraints.NORTH;

            panel.add(buttonPanel, gc);

            frame.getContentPane().add(panel);
            frame.setVisible(true);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

        }

        public static void main(String... args) {
            TableExample3 example = new TableExample3();
            SwingUtilities.invokeLater(() -> example.createAndShowGui());
        }
    }
差不多

table.setPreferredScrollableViewportSize(table.getPreferredSize());
但最重要的是,在“添加”和“删除”的操作处理程序中
setPreferredSize
setPreferredViewportSize
revalidate
repaint
, 因为它弊大于利

Dimension preferredTableSize = table.getPreferredSize();
preferredTableSize.height = 100;
table.setPreferredScrollableViewportSize(preferredTableSize);

然后,滚动条将根据需要显示和消失。

添加/删除按钮应位于表的最后一行之后。如果我这样做,添加/删除按钮应该就在表的最后一行之后。如果我像您所说的那样设置表视图端口大小,那么这些按钮将显示在最后一行之后很远的地方。此外,一旦添加了新行,表格面板的大小应增加以容纳该行,直到整个面板填满为止(即增加表格面板的大小并减小包含按钮面板的较低网格单元的大小)。现在,当添加下一行时,由于没有空间,应该会出现一个滚动条。@user2596386那么最好忽略我回答的前半部分。添加/删除按钮应该在表格的最后一行之后。如果我这样做,添加/删除按钮应该就在表的最后一行之后。如果我像您所说的那样设置表视图端口大小,那么这些按钮将显示在最后一行之后很远的地方。此外,一旦添加了新行,表格面板的大小应增加以容纳该行,直到整个面板填满为止(即增加表格面板的大小并减小包含按钮面板的较低网格单元的大小)。现在,当添加下一行时,由于没有空格,应该会出现一个滚动条。@user2596386那么最好忽略我答案的前半部分