gpt4 book ai didi

java - 使用 FlowLayout 的面板不能包含 JScrollPanes?

转载 作者:行者123 更新时间:2023-12-01 22:51:17 25 4
gpt4 key购买 nike

我一开始就是这么做的。

public class MyFrame extends JFrame {

public MyFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(500 ,300));
setResizable(false);
pack();
setLocationRelativeTo(null);

initComponents();
}

private void initComponents() {

JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

for (int i=0; i < 100; i++)
panel.add(new JLabel("some text"));

JScrollPane scrollPane = new JScrollPane(panel,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

// Here I create a JPanel to replace the contentPane of JFrame
JPanel contentPane = new JPanel();
contentPane.add(scrollPane);
setContentPane(contentPane);
}

如果我用以下内容替换最后 3 行:

getContentPane().add(scrollPane);   

一切都好。但正如我之前所做的那样,垂直滚动条没有显示。是什么原因造成的?将 JPanel 设置为 contentPane 是否错误?

更新: 如果 contentPane 更改为 BorderLayout 一切正常。

// Here I create a JPanel to replace the contentPane of JFrame
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.add(scrollPane);
setContentPane(contentPane);

所以问题出在默认的 FlowLayout 上?

已解决: 问题出在 FlowLayout 上。它环绕 JScrollPane 并隐藏工具栏。使用

scrollPane.setPreferredSize(new Dimension(500, 400)); // longer space in x-axis

解决了。

答案:JSrollPane 不应在使用 FlowLayout 的容器内使用。

最佳答案

首先 - 使用您自己的组件作为内容 Pane 并没有什么不好。但默认内容 Pane 也是一个 JPanel 实例,因此实际上没有必要将其替换为您自己的面板,除非您想使用非面板内容 Pane 或自定义面板组件。

默认内容 Pane 如下所示:

/**
* Called by the constructor methods to create the default
* <code>contentPane</code>.
* By default this method creates a new <code>JComponent</code> add sets a
* <code>BorderLayout</code> as its <code>LayoutManager</code>.
* @return the default <code>contentPane</code>
*/
protected Container createContentPane() {
JComponent c = new JPanel();
c.setName(this.getName()+".contentPane");
c.setLayout(new BorderLayout() {
/* This BorderLayout subclass maps a null constraint to CENTER.
* Although the reference BorderLayout also does this, some VMs
* throw an IllegalArgumentException.
*/
public void addLayoutComponent(Component comp, Object constraints) {
if (constraints == null) {
constraints = BorderLayout.CENTER;
}
super.addLayoutComponent(comp, constraints);
}
});
return c;
}

该方法取自JRootPane。正如您所看到的,它基本上是一个简单的 JPanel,带有一个自定义的布局管理器。

现在,您的示例中存在一些问题。

首先是调用的顺序 - 您在向框架添加内容之前调整框架的大小。只需更改顺序,您就会看到滚动 Pane :

public class MyFrame extends JFrame
{
public MyFrame ()
{
super();

// Add components first
initComponents ();

// Setup frame after so it fits its new content
setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
setPreferredSize ( new Dimension ( 500, 300 ) );
setResizable ( false );
pack ();
setLocationRelativeTo ( null );
}

private void initComponents ()
{
JPanel panel = new JPanel ();
panel.setLayout ( new BoxLayout ( panel, BoxLayout.Y_AXIS ) );

for ( int i = 0; i < 100; i++ )
{
panel.add ( new JLabel ( "some text" ) );
}

JScrollPane scrollPane =
new JScrollPane ( panel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );

// Here I create a JPanel to replace the contentPane of JFrame
JPanel contentPane = new JPanel ();
contentPane.add ( scrollPane );
setContentPane ( contentPane );
}

public static void main ( String[] args )
{
SwingUtilities.invokeLater ( new Runnable ()
{
public void run ()
{
new MyFrame ().setVisible ( true );
}
} );
}
}

它看起来仍然会有所不同,因为您的 new JPanel () 默认情况下使用 FlowLayout,而不是默认内容 Pane 组件使用的 BorderLayout:
With FlowLayout

只需设置BorderLayout,您就会得到您想要看到的结果:

JPanel contentPane = new JPanel ( new BorderLayout () );

关于java - 使用 FlowLayout 的面板不能包含 JScrollPanes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24698143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com