java - 将视口(viewport)宽度设置为滚动 Pane 宽度

标签 java swing jscrollpane

有没有办法将 JScrollPane 视口(viewport)的宽度固定为其所有者(JScrollPane)的宽度。我的目标是一个 JScrollPane,它可以向下滚动,但视口(viewport)的宽度被压缩/设置为 JScrollPane 的大小。

我尝试手动设置视口(viewport)的大小,但失败了,因为我使用了 GridLayout 来布局组件。我还尝试了 GridBagLayout 并将约束设置为视口(viewport)及其组件。我还禁用了水平滚动条。

我不熟悉宽度 Java FX。

最佳答案

您只需为面板实现Scrollable 界面即可。这是一个例子:

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

/**
 * <code>ScrollableExample</code>.
 */
public class ScrollableExample implements Runnable {

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

    @Override
    public void run() {
        JPanel scrollPanel = new ScrollablePanel();
        scrollPanel.setLayout(new GridLayout(20, 1));
        for (int i = 0; i < 20; i++) {
            scrollPanel.add(new JLabel("It's a simple label to test whether scrolling works " + i));
        }
        JFrame frm = new JFrame("Test scrolling");
        frm.add(new JScrollPane(scrollPanel));
        frm.setSize(220, 200);
        frm.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }

    private static class ScrollablePanel extends JPanel implements Scrollable {

        @Override
        public Dimension getPreferredScrollableViewportSize() {
            return getPreferredSize();
        }

        @Override
        public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 5;
        }

        @Override
        public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
            return 20;
        }

        @Override
        public boolean getScrollableTracksViewportWidth() {
            // no horizontal scroll bar
            return true;
        }

        @Override
        public boolean getScrollableTracksViewportHeight() {
            return false;
        }

    }
}

关于java - 将视口(viewport)宽度设置为滚动 Pane 宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56561431/

相关文章:

java - setAttribute() 之后 name 属性的设置值中断

java - 对下拉列表进行排序

java - 排序器更改行顺序后如何更新 JTableModel?

java - 捕获特定时刻的检查按钮的值

java - 在哪里放置 AdMob 横幅?

java - 如何使用 java 以编程方式在 Amazon S3 存储桶之间传输文件?

java - 布局使 JFrame 最小化并且没有内容

java - 如何阻止 JTextField 和 JTextLabel 在 JPanel 上截断

java - 调整 JScrollPane 和 JTabbedPane 大小的问题

java - 为什么我的 Java Swing JScrollPane 不断滚动到顶部?