边框布局中的滚动条.PAGE_START/NORTH



如果(且仅当(没有足够的空间,是否有办法使添加到BorderLayout.PAGE_START区域的组件变得可滚动?

我附上了一个最小的例子。如果调整整个框架的大小,则中心的标签将变为可滚动的,而顶部的标签则不会。

不幸的是,我无法更改BorderLayout.PAGE_START的定位,因为这是由一个框架给出的。然而,我确实完全控制了myComponent的创建。

public static void main(String[] args){
JPanel panel = new JPanel(new BorderLayout());
JComponent myComponent = new JScrollPane(new JLabel("<html>START-START<br><br>START-START</html>"));
panel.add(myComponent, BorderLayout.PAGE_START);
panel.add(new JScrollPane(new JLabel("<html>CENTER-CENTER<br><br>CENTER-CENTER</html>")), BorderLayout.CENTER);
final JFrame mainframe = new JFrame("Test");
mainframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
mainframe.getContentPane().add(panel);
javax.swing.SwingUtilities.invokeLater(() -> {
mainframe.pack();
mainframe.setVisible(true);});
}

如果没有足够的空间,是否有办法将添加到BorderLayout.PAGE_START区域的组件变成可滚动的?

是的。使其首选高度小于实际高度。BorderLayout尊重PAGE_START中包含的组件的首选高度,因此无论您在JLabel中放了多少行,它都将以其首选高度显示,而不带滚动条。

请尝试以下操作。

public static void main(String[] args) {
JPanel panel = new JPanel(new BorderLayout());
JComponent myComponent = new JScrollPane(new JLabel("<html>START-START<br><br>START-START</html>"));
myComponent.setPreferredSize(new Dimension(100, 20));
panel.add(myComponent, BorderLayout.PAGE_START);
panel.add(new JScrollPane(new JLabel("<html>CENTER-CENTER<br><br>CENTER-CENTER</html>")),
BorderLayout.CENTER);
final JFrame mainframe = new JFrame("Test");
mainframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
mainframe.getContentPane().add(panel);
javax.swing.SwingUtilities.invokeLater(() -> {
mainframe.pack();
mainframe.setVisible(true);
});
}

编辑

下面的代码没有给出最好的结果,但我认为这是最好的方法。您只需要摆弄不同尺寸的不同组件。

我在JFrame的内容窗格中添加了一个ComponentListener。调整JFrame的尺寸时,需要根据需要重新计算顶部构件和中心构件的高度,然后更新相关构件的尺寸。请注意,下面的代码不是一个完整的解决方案,但希望足以让您获得一个完整解决方案。

public static void main(String[] args) {
final JFrame mainframe = new JFrame("Test");
JLabel topLabel = new JLabel("<html>START-START<br><br>START-START");
JScrollPane topPane = new JScrollPane(topLabel);
mainframe.add(topPane, BorderLayout.PAGE_START);
JLabel centerLabel = new JLabel("<html>CENTER-CENTER<br><br>CENTER-CENTER");
centerLabel.setMinimumSize(centerLabel.getPreferredSize());
JPanel centerPane = new JPanel();
centerPane.add(centerLabel);
mainframe.add(centerPane, BorderLayout.CENTER);
javax.swing.SwingUtilities.invokeLater(() -> {
mainframe.pack();
mainframe.setVisible(true);
final Dimension centerPaneDim = centerPane.getPreferredSize();
final Dimension topLabelDim = topLabel.getPreferredSize();
mainframe.getContentPane().addComponentListener(new ComponentListener() {

@Override
public void componentShown(ComponentEvent e) {
// Do nothing.
}

@Override
public void componentResized(ComponentEvent e) {
Dimension size = e.getComponent().getSize();
if (size.height < centerPaneDim.height + topLabelDim.height + 10) {
topPane.setPreferredSize(new Dimension(topLabelDim.width, 10 + size.height - centerPaneDim.height));
}
else {
topPane.setPreferredSize(new Dimension(topLabelDim.width, topLabelDim.height + 10));
}
e.getComponent().revalidate();
e.getComponent().repaint();
}

@Override
public void componentMoved(ComponentEvent e) {
// Do nothing.
}

@Override
public void componentHidden(ComponentEvent e) {
// Do nothing.
}
});
});
}

相关内容

  • 没有找到相关文章

最新更新