Java JSCrollPane 不会将大小调整到低于带有文本的 JButton 的最小尺寸

问题描述 投票:0回答:1

我正在尝试将 JPanel (GridLayout 0, 1) 与 JButtons 放在 JScrollPane 的 ViewPort 中。这很容易做到,但在调整父 JFrame 的大小时,它的行为并不“正确”。按钮可以调整大小以按预期填充整个面板,但有一个主要限制。如果我尝试水平调整框架大小(在运行时通过角拖动),它会在一个点后停止。面板将无限延伸,但不会收缩到低于在具有最短文本的按钮上显示文本所需的最小尺寸。

垂直调整框架大小没有这样的问题。框架将收缩至零。按钮将被压扁,直到达到最小尺寸,之后它们就会简单地夹在框架之外。这是我想要的行为,因为我打算将整个内容粘贴到 JScrollPane 中,此时会出现滚动条。我想要相同的水平行为,但无论我如何尝试都无法得到它。

到目前为止,我已经尝试使用 GridLayout 和 GridBagLayout。对于仅仅一列按钮来说,后者似乎是不必要的粗暴。但是,因为这是一列,所以我无法使用 FlowLayout,因为它会横向排列对象,而且我不知道如何更改它。更重要的是 - GridLayout 和 GridBagLayout 都以我喜欢的方式充满空间和对齐按钮,这是我无法使用其他布局管理器完成的。

我整理了一个非常丑陋的测试示例来演示我看到的行为。它并不意味着漂亮或可扩展,因为我只是在学习它的机制。

JFrame frame = new JFrame();
frame.setSize(500, 500);
frame.setLocation(200, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panel1 = new JPanel(new GridLayout(0, 1));
panel1.setMinimumSize(new Dimension(10,10));
panel1.setBackground(Color.BLUE);

JTabbedPane tabbedPane = new JTabbedPane();

JScrollPane scrollPane = new JScrollPane(panel1, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
tabbedPane.addTab("Tab ", scrollPane);

JButton button1 = new JButton("Button 1");
button1.setPreferredSize(new Dimension(300,100));
panel1.add(button1);

JButton button2 = new JButton("Button 2---------------");
button2.setPreferredSize(new Dimension(300,100));
panel1.add(button2);
    
JButton button3 = new JButton("Button 3");
button3.setPreferredSize(new Dimension(300,100));
panel1.add(button3);

JButton button4 = new JButton("But");
button4.setPreferredSize(new Dimension(300,100));
panel1.add(button4);

frame.add(tabbedPane);
frame.setVisible(true);
java swing layout-manager jscrollpane
1个回答
0
投票

我用你的代码创建了一个Java类。

无需单独调整尺寸

JButtons
JPanel
GridLayout
将使它们全部尺寸相同。 我在按钮面板中添加了一些空白,以便您可以看到蓝色背景。

在水平方向上,我可以将

JFrame
缩小到大约 100 像素。 我可以将
JFrame
扩展到显示器的宽度。

垂直方向,我可以将

JFrame
缩小到标题栏。 我可以将
JFrame
扩展到显示器的高度。

我在 Java 8 上运行了代码。

这是完整的可运行代码。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

public class JScrollPaneExample implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new JScrollPaneExample());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTabbedPane tabbedPane = new JTabbedPane();
        JScrollPane scrollPane = new JScrollPane(createButtonPanel());
        tabbedPane.addTab("Tab ", scrollPane);
        frame.add(tabbedPane, BorderLayout.CENTER);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createButtonPanel() {
        JPanel panel1 = new JPanel(new GridLayout(0, 1, 5, 5));
        panel1.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        panel1.setMinimumSize(new Dimension(10, 10));
        panel1.setBackground(Color.BLUE);

        JButton button1 = new JButton("Button 1");
//      button1.setPreferredSize(new Dimension(300,100));
        panel1.add(button1);

        JButton button2 = new JButton("Button 2---------------");
//      button2.setPreferredSize(new Dimension(300,100));
        panel1.add(button2);

        JButton button3 = new JButton("Button 3");
//      button3.setPreferredSize(new Dimension(300,100));
        panel1.add(button3);

        JButton button4 = new JButton("But");
//      button4.setPreferredSize(new Dimension(300,100));
        panel1.add(button4);

        return panel1;
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.