【问题标题】:panel doesn't want to scroll面板不想滚动
【发布时间】:2019-12-21 15:38:08
【问题描述】:

我有这段代码(一个包含其他JComponents 的面板,在本例中为JButtons)和一个问题。

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.util.*;

public class JTagPanelTest extends JPanel{

    public JTagPanelTest(){
        setLayout(new FlowLayout(FlowLayout.LEADING, 2, 0));
    }

    public void initializeTags(List<String> tags){
        tags.forEach(tag -> add(new JButton(tag)));
    }

    public static void main(String[] args){
        EventQueue.invokeLater(() -> {
            try{
                String lookAndFeelName = UIManager.getSystemLookAndFeelClassName();
                UIManager.setLookAndFeel(lookAndFeelName);
            }
            catch(Exception e){
                e.printStackTrace();
            }

            JTagPanelTest test = new JTagPanelTest();
            test.initializeTags(Arrays.asList("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
                "012", "qwer", "z<xc", "rty", "poiu", "gfj", "zxcv", "mjnb", "mko", "nij", "bhu"));
            JScrollPane scrollPane = new JScrollPane(test);
            scrollPane.setHorizontalScrollBar(null);
            test.setPreferredSize(new Dimension(200, 100));
//          scrollPane.setPreferredSize(new Dimension(200, 180));
            JFrame frame = new JFrame("Test");
            frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(new Dimension(200, 180));
            frame.setLocationRelativeTo(null);
            frame.setResizable(false);
            frame.setVisible(true);
        });
    }

}

我虽然将我的JTagPanelTest 放在JScrollPane 中使其滚动就足够了,但事实并非如此,我真的不知道为什么。

计算内部面板的最终高度没有用,因为它的结果是0

注意JButtons 的数量不是固定的,所以面板必须是可滚动的才能显示所有的“按钮”。

有没有人能让我意识到我的错误?

谢谢

【问题讨论】:

  • 请注意,所有 Swing 组件都应在事件调度线程 (EDT) 上创建。所以所有的代码,不仅仅是 setVisible(...) 应该是invokeLater(...)的一部分
  • test.setPreferredSize(new Dimension(200, 100)); 人为地限制了测试 JPanel 的大小。你绝对不想想要这样做。
  • 如果我删除该行按钮不会在面板边缘换行

标签: java swing jscrollpane jcomponent


【解决方案1】:

您通过在scrollPane 上设置首选大小尝试了正确的方法。

所以回到那个变化。它不滚动的原因是您的内容未添加为垂直对齐。设置有助于垂直添加项目的布局。

例如:

test.setLayout(new BoxLayout(test, BoxLayout.Y_AXIS));
//test.setPreferredSize(new Dimension(200, 100));
scrollPane.setPreferredSize(new Dimension(200, 180));

【讨论】:

  • 非常感谢!! ...但是以这种方式,所有按钮都出现在列中...有没有办法让按钮列表包含在面板的右边缘并可能垂直延伸?
【解决方案2】:

我知道您希望按钮换行,因此您将它们添加到使用FlowLayout 布局管理器的JPanel。我也了解您希望包含这些按钮的 JPanel 滚动。我通过设置包含按钮的JScrollPaneJPanel 的首选大小来实现这一点,如下面的代码所示。

import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.Arrays;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;

public class BtnScrl implements Runnable {
    public void run() {
        showGui();
    }

    private void showGui() {
        JFrame frame = new JFrame("BtnScrl");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(createButtons());
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JScrollPane createButtons() {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(400, 290));
        for (String tag : Arrays.asList("one",
                                        "two",
                                        "three",
                                        "four",
                                        "five",
                                        "six",
                                        "seven",
                                        "eight",
                                        "nine",
                                        "ten",
                                        "012",
                                        "qwer",
                                        "z<xc",
                                        "rty",
                                        "poiu",
                                        "gfj",
                                        "zxcv",
                                        "mjnb",
                                        "mko",
                                        "nij",
                                        "bhu")) {
            panel.add(new JButton(tag));
        }
        JScrollPane scrollPane = new JScrollPane(panel);
        scrollPane.setPreferredSize(new Dimension(400, 100));
        return scrollPane;
    }

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

这是正在运行的应用程序的屏幕截图。

【讨论】:

  • 用你的代码尝试了几次后,我得出的结论是滚动窗格滚动是因为你添加了panel.setPreferredSize(new Dimension(400, 290));这一行,而且我事先不知道整个面板的高度。
  • @maurotrev 您可以根据按钮的大小计算首选大小。或者您可以设置任意大小,这就是 JTable 所做的。这些不是唯一可用的选项。如果您希望在问题中添加详细信息,您可以。您需要做的就是edit您的问题。请注意,我确实在我的回答中写道,我设置了 JPanelJScrollPane 的首选大小。
【解决方案3】:

我还发现this code 解决了垂直堆叠组件的问题。还有this one

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-20
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2010-11-29
    • 1970-01-01
    相关资源
    最近更新 更多