【问题标题】:How to change the length of the JScrollBar in Swing?如何在 Swing 中更改 JScrollBar 的长度?
【发布时间】:2019-01-25 01:57:21
【问题描述】:

我想将滚动条的大小调整为画布窗口的大小,使其与图像窗口的宽度相同。

这是我目前所拥有的:

我们将不胜感激。

我尝试了setPreferedsize(),我尝试了setVisibleAmount(),但都没有工作。

     JScrollBar SB = new JScrollBar();


        SB.setMinimum(1);
        SB.setMaximum(Cavalieri_counting_2.img.getNSlices() + 9);
        SB.setValue(img.getCurrentSlice());
        SB.setOrientation(Adjustable.HORIZONTAL);
        //SB.setVisibleAmount(SB.getMaximum());;

        //SB.setOrientation(JScrollBar.HORIZONTAL);
        GridBagConstraints gbc_scrollBar = new GridBagConstraints();
        //gbc_scrollBar.insets = new Insets(0, 0, 5, 0);
        gbc_scrollBar.gridwidth = 20;
        gbc_scrollBar.gridx = 0;
        gbc_scrollBar.gridy = 18;
        View_Panel.add(SB, gbc_scrollBar);
        SB.setVisible(true);

【问题讨论】:

  • (1-) 为什么要使用 JScrollBar?您上一个问题 (stackoverflow.com/questions/54337684/…) 中的建议是使用 JScrollPane。
  • gbc_scrollBar.gridwidth = 20;gbc_scrollBar.gridy = 18; - 你从哪里得到这些数字?您不能只是随机选择 18 和 20 作为数字 如果您实际上在面板中添加了 20 个其他组件,则只能使用这些值。阅读 How to Use GridBagLayout 上的 Swing 教程,了解基础知识和工作示例。我还将阅读How to Use Text Areas 上的部分以获取使用 JScrollPane 的工作示例。 How to Use Scroll Panes 部分解释了滚动窗格的工作原理。
  • 而且您还没有按照上一个问题的建议发布正确的minimal reproducible example

标签: java swing jframe jscrollbar


【解决方案1】:

首先 - GridBag 布局不能通过设置像素坐标来工作,而是与屏幕上的其他对象成比例地构造。请参阅this 链接。

了解这一点尤其重要:

在 GridBagLayout 中没有办法指定网格的大小。不必有。网格大小由所有对象的约束隐含地确定;

可以在这张图片中看到一个例子。屏幕上的每个“位置”实际上是一个相对的网格位置。

其次 - 您的问题措辞奇怪,但据我了解,您想更改滚动条的长度,使其覆盖更多屏幕。为了更改滚动条的属性,更改ScrollBar.setPreferedSize() 很重要。 See JScrollBars.

这是正确的改变方法。如果setPreferedSize() 不起作用,那么您显然没有发布所有代码。尝试检查您是否没有在程序中的某处覆盖它(使用setMaximumSize() 或在其他地方意外地再次设置大小)。

如果您没有覆盖它,那么您的布局管理器可能会遇到错误。在您的other 问题中,您似乎正在手动设置行和列大小。这可能会覆盖组件的大小:

GridBagLayout gbl_ViewPane = new GridBagLayout();
gbl_ViewPane.columnWidths = new int[]{0, 0, 0, 0, 0, 222, 0};
gbl_ViewPane.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
gbl_ViewPane.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
gbl_ViewPane.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
ViewPane.setLayout(gbl_ViewPane);

或者,您的布局管理器可能没有正确实现,或者您可能没有正确pack()ing 滚动条。如果您以更孤立的方式测试您的代码,您会发现它可能是您的代码中的错误导致错误。

还要注意it is bad practice to set size manually

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多