带有固定宽度的JScrollPane

6

我是一个Java Swing的新手,对于下面的代码感到困惑。

我的目标是创建一个带有两个JTextPane的垂直可滚动面板,第一个JTextPane的宽度为父面板的70%,第二个JTextPane的宽度为父面板的30%。由于这两个JTextPane具有固定的宽度,只有在垂直方向上才会随着更多文本而扩展。

我采用了这种解决方案,因为我只想为这两个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(s)只有在插入一些文本后才会调整大小。
  • 垂直滚动条无法正常工作。

也许这可以帮助。我刚刚测试了一下,提供的解决方案也适用于JTextPane。你只需要稍微调整一下就可以了。https://dev59.com/5mXWa4cB1Zd3GeqPL1jx - RubioRic
抱歉,那个示例只适用于一个滚动条。我的错误。 - RubioRic
是的,但感谢您的评论。 - user3102393
1个回答

11
问题在于滚动窗格会按其首选大小显示组件,然后根据需要添加滚动条。
在您的情况下,您希望宽度受到滚动窗格视口的限制。
因此,您需要在添加到视口的组件上实现“Scrollable”接口。 “Scrollable”接口将允许您强制组件宽度与视口宽度匹配,从而限制每个JTextPane的宽度,导致文本换行。
实现此功能的简单方法是使用Scrollable Panel。 该类实现了可滚动接口,并允许您通过使用参数覆盖可滚动方法。
因此,基本代码将是:
ScrollablePanel panel = new ScrollablePanel( new BorderLayout());
panel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );

第一个JTextPane的宽度为父面板的70%,第二个JTextPane的宽度为固定的30%。
一种方法是使用JSplitPane,这样您就可以在两个文本窗格之间放置分隔符,文本不会合并成一个。
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%,并且随着框架的调整,文本窗格将增大/缩小。

要使面板垂直可滚动,还需设置 panel.setScrollableHeight( ScrollablePanel.ScrollableSizeHint.STRETCH); - vovahost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接