调整包含具有JTable的JscrollPane的JPanel的大小

时间:2014-08-07 21:03:31

标签: java swing jtable jscrollpane

enter image description here

我有一个JPanel(名为mainJP),它有几个按钮和标签(使用BorderLayout)。接下来,它会添加另一个JPanel(名为JP1),并在其中添加一个ScrollPane,其中包含JTable。我希望能够调整JP2的大小,以及其所有子组件(ScrollPaneJTable)的大小。这样我就可以看到JTable的更多行,而不必滚动。另外为了调整JP1的大小,JP1的其他兄弟姐妹应该自己调整。不知道如何实现这一目标。

如图所示,我已经实现了一些功能 - 完全删除JP1,展开/折叠JP1视图,删除和添加JTable中的行。

基本上我希望能够在JP1的底部边框拖动鼠标,以垂直增加JP1及其子组件(ScrollPaneJTable)的大小。

如下面的一些解决方案所述,我仍然感到困惑,我应该在哪个级别加入JSpiltPane - 因为它只允许添加2个组件。我认为所有JP1都应该在JSplitPane。但是,可以有多个JP1组件,它们是动态添加的。

3 个答案:

答案 0 :(得分:1)

向JSplitPane添加额外组件非常简单。将JPanel放在要显示组件的每个窗格中,然后将组件添加到此面板 - 您可以根据需要自定义布局。

这样的东西会将JSplitPane放入已创建的JFrame中,向每个窗格添加一个JPanel,然后在左侧添加一些JLabel,在右侧添加一个JTextField。 splitpane将扩展到它所在的JFrame的大小。

JSplitPane splitPane = new JSplitPane();
JPanel leftPanel = new JPanel();
JPanel rightPanel = new JPanel();
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
JTextField textField = new JTextField();
GridBagConstraints gBC = new GridBagConstraints();

getContentPane().setLayout(new GridBagLayout());
leftPanel.setLayout(new GridBagLayout());
rightPanel.setLayout(new GridBagLayout());

// I'm not going to bother doing any layout of the label or textfield here
leftPanel.add(label1, new GridBagConstraints());
leftPanel.add(label2, new GridBagConstraints());
rightPanel.add(textField, new GridBagConstraints());

splitPane.setLeftComponent(leftPanel);
splitPane.setRightComponent(rightPanel);

gBC.fill = GridBagConstraints.BOTH;
gBC.weightx = 1.0;
gBC.weighty = 1.0;
getContentPane().add(splitPane, gBC);

pack();

答案 1 :(得分:0)

这是两个不同的问题。在鼠标拖动时调整JPanel的大小 - 最简单的方法是使用两个嵌套的JSplitPanes。您可以使用一个,以便水平拖动,另一个垂直拖动。

或者,如果您不想要拆分窗格,可以尝试使用此方法,并创建自定义JPanel。边界是为了使效果更加明显。我个人不喜欢它,因为它过于复杂。

public class ResizablePanel extends JPanel {

    private boolean drag = false;
    private Point dragLocation  = new Point();

    public  ResizablePanel() {
        setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
        setPreferredSize(new Dimension(500, 500));
        final JFrame f = new JFrame("Test");
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                drag = true;
                dragLocation = e.getPoint();
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                drag = false;
            }
        });
        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                if (drag) {
                    if (dragLocation.getX()> getWidth()-10 && dragLocation.getY() > getHeight()-10) {
                        System.err.println("in");
                        setSize((int)(getWidth()+(e.getPoint().getX()-dragLocation.getX())),
                            (int)(getHeight()+(e.getPoint().getY()-dragLocation.getY())));
                        dragLocation = e.getPoint();
                    }
                }
            }
        });
        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add(this,BorderLayout.CENTER);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        new ResizablePanel();
    }

    public void paintComponent(Graphics g) {
        g.setColor(Color.red);
        g.fillRect(0, 0, getWidth(), getHeight());
    }
}

答案 2 :(得分:0)

至于孩子用它的父母调整大小,使用GridBagLayout很容易。

GridBagConstraints中要记住的重要部分是fill,weightx和weighty。

你可以在你的框架中做这样的事情 - 它会在其中放置一个带有JTable的滚动窗格,它将随框架调整大小:

JScrollPane jScrollPane1 = new JScrollPane();
JTable jTable1 = new JTable();
GridBagConstraints gBC = new GridBagConstraints();

getContentPane().setLayout(new GridBagLayout());
jScrollPane1.setViewPortView(jTable1);

gBC.fill = GridBagConstraints.BOTH;
gBC.weightx = 1.0;
gBC.weighty = 1.0;

getContentPane().add(jScrollPane1, gBC);