有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

固定宽度的java JScrollPane

我是JavaSwing的新手,对下一个代码感到困惑

我的目标是使垂直滚动面板,其中包含2个JTextPane。第一个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对SOUTH没有任何限制,因此它们可以这样成长

问题:

  • JTextPane仅在插入一些文本后调整大小
  • 垂直滚动条不工作

共 (1) 个答案

  1. # 1 楼答案

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

    在本例中,您希望宽度受滚动窗格视口的约束

    因此,您需要在添加到视口的组件上实现Scrollable接口。Scrollable界面将允许您强制组件宽度与视口宽度匹配,从而限制每个JTextPane的宽度,从而导致文本换行

    实现此功能的一个简单方法是使用Scrollable Panel。此类实现可滚动接口,并允许您通过使用参数覆盖可滚动方法

    所以基本准则是:

    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,这样两个文本窗格之间就有一个分隔符,而文本不会合并为一个

    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%,文本窗格将随着帧大小的调整而增大/缩小