我是Java Swing的新手,我对下一个代码感到困惑.
我的目标是制作垂直可滚动面板,里面有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()));
}
});
}
Run Code Online (Sandbox Code Playgroud)
JTextPane对SOUTH没有约束,因此他们可以通过这种方式成长.
问题:
问题是,scrollpane将以其首选大小显示组件,然后根据需要添加滚动条.
在您的情况下,您希望宽度受滚动窗格的视口约束.
因此,您需要Scrollable在添加到视口的组件上实现接口.该Scrollable界面将允许你强制部件宽度符合该视这反过来将限制每个JTextPane中的导致文本换行宽度的宽度.
实现此功能的一种简单方法是使用Scrollable Panel.此类实现Scrollable接口,并允许您通过使用参数覆盖Scrollable方法.
所以基本代码是:
ScrollablePanel panel = new ScrollablePanel( new BorderLayout());
panel.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.FIT );
panel.setScrollableHeight( ScrollablePanel.ScrollableSizeHint.STRETCH );
Run Code Online (Sandbox Code Playgroud)
第一个JTextPane,固定宽度为父面板的70%,第二个JTextPane,固定宽度为30%
一种方法可能是使用JSplitPane,因此在两个文本窗格之间有一个分隔符,文本不会合并为一个.
JSplitPane splitPane = new JSplitPane();
splitPane.setLeftComponent(new JTextPane());
splitPane.setRightComponent(new JTextPane());
splitPane.setResizeWeight(0.7);
splitPane.setDividerLocation(.7);
Run Code Online (Sandbox Code Playgroud)
然后你只需将所有内容添加到框架中:
panel.add(splitPane);
frame.add(new JScrollPane(panel), BorderLayout.CENTER);
Run Code Online (Sandbox Code Playgroud)
现在,分隔符位置将保持在70%,文本文本窗格将随着帧的大小调整而增大/缩小.