gpt4 book ai didi

java - 如何将 JComponent 定位到 BorderLayout 中的真正中心?

转载 作者:行者123 更新时间:2023-11-30 03:17:02 27 4
gpt4 key购买 nike

我正在开发一个 Swing 应用程序,使用 BorderLayout 来定位组件。由于 BorderLayout.CENTER 将组件定位到放置其他组件后剩下的任何位置,并且这一事实使我的 GUI 看起来很奇怪,我想知道是否有一种方法将组件定位到 true 中心,而不是两侧之间。由于 BorderLayout 空间使组件填充整个空间,我猜测解决方案是将组件包装到 JPanel 中。但是,如果其他侧有组件,则将组件定位到该面板的中心将使组件比另一侧更靠近一侧。我该如何解决这个问题?

这些图像展示了问题和理想的解决方案;灰色边框代表主框架的 BorderLayout.SOUTH(包裹在 JPanel 中)。黑色方 block 代表与中心组件不同的组件。红色方 block 代表需要居中的组件。

问题:

Problem representation

理想的解决方案:

Solution representation

最佳答案

正如我所看到的问题,为了使红色组件居中,右侧和左侧组件的大小必须相同。

您也许可以使用 Relative Layout

RelativeLayout 将允许您使右/左组件具有相同的大小,同时将中心组件保持在其首选大小。当调整框架大小时,将在右/左组件中添加/删除空间。

例如:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;

public class SSCCE extends JPanel
{
public SSCCE()
{
JPanel left = new JPanel( new FlowLayout(FlowLayout.LEFT) );
JPanel leftBox = new JPanel();
leftBox.setPreferredSize( new Dimension(200, 50) );
leftBox.setBackground( Color.BLACK );
left.add( leftBox );

JPanel center = new JPanel( new FlowLayout(FlowLayout.CENTER) );
JPanel centerBox = new JPanel();
centerBox.setPreferredSize( new Dimension(50, 50) );
centerBox.setBackground( Color.RED );
center.add( centerBox );

JPanel right = new JPanel( new FlowLayout(FlowLayout.RIGHT) );
JPanel rightBox = new JPanel();
rightBox.setPreferredSize( new Dimension(50, 50) );
rightBox.setBackground( Color.BLACK );
right.add( rightBox );

setLayout( new RelativeLayout(RelativeLayout.X_AXIS, 5) );
add(left, new Float(1));
add(center);
add(right, new Float(1));
}

private static void createAndShowGUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new SSCCE());
frame.setLocationByPlatform( true );
frame.pack();
frame.setVisible( true );
}

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
}

相对布局的一个问题是,当您打包框架时,组件将显示得太小,因为首选尺寸只是组件的总和。因此左侧面板将被截断。

在上面的示例中,您可以添加以下内容来解决此问题:

right.add( rightBox );
right.setPreferredSize( left.getPreferredSize() ); // added

另一个选择可能是使用 OverlayLayout,它可以设置为在包含其他两个组件的面板顶部显示红色面板:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class SSCCE extends JPanel
{
public SSCCE()
{
JPanel left = new JPanel( new FlowLayout(FlowLayout.LEFT) );
JPanel leftBox = new JPanel();
leftBox.setPreferredSize( new Dimension(200, 50) );
leftBox.setBackground( Color.BLACK );
left.add( leftBox );

JPanel center = new JPanel( new FlowLayout(FlowLayout.CENTER) );
center.setOpaque(false);
JPanel centerBox = new JPanel();
centerBox.setPreferredSize( new Dimension(50, 50) );
centerBox.setBackground( Color.RED );
center.add( centerBox );

JPanel right = new JPanel( new FlowLayout(FlowLayout.RIGHT) );
JPanel rightBox = new JPanel();
rightBox.setPreferredSize( new Dimension(50, 50) );
rightBox.setBackground( Color.BLACK );
right.add( rightBox );

JPanel main = new JPanel( new BorderLayout() );
main.add(left, BorderLayout.LINE_START);
main.add(right, BorderLayout.LINE_END);

setLayout( new OverlayLayout(this) );
add(center);
add(main);
}

private static void createAndShowGUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new SSCCE());
frame.setLocationByPlatform( true );
frame.pack();
frame.setVisible( true );
}

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
}

关于java - 如何将 JComponent 定位到 BorderLayout 中的真正中心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32322741/

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