Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将JComponent定位到BorderLayout中的true center?_Java_Swing_Border Layout - Fatal编程技术网

Java 如何将JComponent定位到BorderLayout中的true center?

Java 如何将JComponent定位到BorderLayout中的true center?,java,swing,border-layout,Java,Swing,Border Layout,我正在开发一个Swing应用程序,使用BorderLayout定位组件。由于BorderLayout.CENTER将组件定位到其他组件放置后剩下的任何位置,并且这一事实使我的GUI看起来很奇怪,我想知道是否有一种方法可以将组件定位到真正的中心位置,而不是位于两侧之间。由于BorderLayout空格会使组件填满整个空间,因此我猜解决方案是将组件包装到JPanel中。但是,如果在另一侧有零部件,则将零部件定位到此面板的中心将使零部件更靠近一侧而不是另一侧。我如何解决这个问题 这些图像展示了问题和理

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

这些图像展示了问题和理想的解决方案;灰色边框表示主框架的
BorderLayout.SOUTH
(包装在
JPanel
中)。黑色正方形表示正在将中心组件抛出的组件。红方块表示需要居中的组件

问题:

理想溶液:


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

您可能可以使用

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();
            }
        });
    }
}

在我看来,问题的形象更平衡、更符合逻辑。例如,如果褐红色矩形是宽度的两倍,会发生什么情况?在“理想解决方案”中,它将与左侧的黑色矩形重叠。我建议您创建自己的LayoutManager实现。只需实现
java.awt.LayoutManager
java.awt.LayoutManager2
,重点是实现方法
layoutContainer
,以布局JPanel中的所有组件。@swing体系结构中的任何组件都不允许这样做。这来自LayoutManager java文档“Swing的绘画体系结构假定JComponent的子元素不重叠”。除非您使用
isOptimizedDrawingEnabled
overiden创建自己的组件以返回false,并且您也创建自己的布局管理器。@并且图像会被放大以显示效果。在我的应用程序(和其他应用程序)中,正方形有更大的空间。”…图像被夸大了”那么?我最小化了我的示例以适合所示的精确图像。替代三重或四重,原始规范也同样有意义(对于那些还没有看到它的人来说,没有)。