java - 固定宽度的 JScrollPane

标签 java swing

我是 Java Swing 的新手,我对接下来的代码感到困惑。

我的目标是制作垂直滚动面板,其中包含2 JTextPane(s)。第一个 JTextPane 固定宽度为父面板的 70%,第二个 JTextPane 固定宽度为 30%。因为两个 JTextPane 都有固定的宽度,所以它们只能垂直扩展更多的文本。

我使用这个解决方案,因为我只想为这 2 个 JTextPane 使用一个滚动条。

我的初始化代码:

private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 616, 374);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(new BorderLayout(0, 0));

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    frame.getContentPane().add(scrollPane);

    JPanel panel = new JPanel();
    scrollPane.setViewportView(panel);
    SpringLayout sl_panel = new SpringLayout();
    panel.setLayout(sl_panel);

    JTextPane leftTextPane = new JTextPane();
    sl_panel.putConstraint(SpringLayout.NORTH, leftTextPane, 10, SpringLayout.NORTH, panel);
    sl_panel.putConstraint(SpringLayout.WEST, leftTextPane, 10, SpringLayout.WEST, panel);
    panel.add(leftTextPane);

    JTextPane rightTextPane = new JTextPane();
    sl_panel.putConstraint(SpringLayout.NORTH, rightTextPane, 10, SpringLayout.NORTH, panel);
    sl_panel.putConstraint(SpringLayout.WEST, rightTextPane, 10, SpringLayout.EAST, leftTextPane);
    sl_panel.putConstraint(SpringLayout.EAST, rightTextPane, -10, SpringLayout.EAST, panel);
    panel.add(rightTextPane);

    scrollPane.addComponentListener(new ComponentAdapter() 
    {
        public void componentResized(ComponentEvent evt) {
            sl_panel.putConstraint(SpringLayout.EAST, leftTextPane, (int)(scrollPane.getWidth() * 0.7), SpringLayout.WEST, (Component)(evt.getSource()));
        }
    });
}

JTextPane(s) 对 SOUTH 没有约束,所以他们可以这样长大。

问题:

  • JTextPane 仅在向其中插入一些文本后才调整大小。
  • 垂直滚动条不起作用。

最佳答案

问题是滚动 Pane 将以其首选大小显示组件,然后根据需要添加滚动条。

在您的情况下,您希望宽度受滚动 Pane 视口(viewport)的限制。

因此您需要在添加到视口(viewport)的组件上实现Scrollable 接口(interface)。 Scrollable 接口(interface)将允许您强制组件宽度与视口(viewport)的宽度相匹配,这反过来会限制每个 JTextPane 的宽度,导致文本换行。

实现此功能的一种简单方法是使用 Scrollable Panel .此类实现了 Scrollable 接口(interface),并允许您使用参数覆盖 Scrollable 方法。

所以基本代码是:

ScrollablePanel panel = new ScrollablePanel( new BorderLayout());
panel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );

The first JTextPane with fixed width 70 % of parent panel and the second JTextPane with fixed width 30 %

执行此操作的一种方法可能是使用 JSplitPane,以便在两个文本 Pane 之间有一个分隔线,并且文本不会合并为一个。

JSplitPane splitPane = new JSplitPane();
splitPane.setLeftComponent(new JTextPane());
splitPane.setRightComponent(new JTextPane());
splitPane.setResizeWeight(0.7);
splitPane.setDividerLocation(.7);

然后您只需将所有内容添加到框架中即可:

panel.add(splitPane);
frame.add(new JScrollPane(panel), BorderLayout.CENTER);

现在分隔线位置将保持在 70%,文本 Pane 将随着框架的大小调整而增大/缩小。

关于java - 固定宽度的 JScrollPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36163364/

相关文章:

java - 在 Java 中创建和检查 URL

java - 创建抽象枚举的方法

java - Spring JSON 转换器。如何绑定(bind)不同类型

Java组件不显示+布局问题

java - JPanel内容不显示

swing - Scala swing 新手问题

java - 我的 ScheduledThreadPoolExecutor 没有关闭

java - 在 Swing 组件和工作线程之间传递数据

java - java中一个简单的按钮处理程序的运行时错误

java - 有没有办法将从所有组合框中选择的值添加到 1 个文本字段中?