当前位置: 首页 > 知识库问答 >
问题:

组件始终位于右上角的Java布局

苏嘉歆
2023-03-14

我的应用程序的主要GUI由一个JDesktopPane组成,它位于框架内容窗格的中心,使用BorderLayout。我希望在屏幕的右上角放置一个组件,它仍然允许用户将空间中的JinternalFrame拖动到该组件的左下角。

将构件设置为BorderLayout的北部或东部似乎会填充整个空间。我想BorderLayout可能不是我想要实现的最好的布局管理器?对更好的方法有什么建议吗?

共有1个答案

东方明亮
2023-03-14

检查出OverlayLayout。它允许您将组件堆叠在一起。

您需要操作setAlignmentX(..) 和设置对齐(…)`方法来获取所需的布局。这些路线如何协同工作并不总是直观的,但将构件设置为顶部/左侧相对容易。

下面是一个供您使用的小演示:

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

public class OverlayLayoutTest extends JPanel
    implements ActionListener
{
    JPanel green;
    JPanel red;
    JLabel greenLabel;
    JLabel redLabel;
    JComboBox  greenAlignmentX;
    JComboBox  greenAlignmentY;
    JComboBox  redAlignmentX;
    JComboBox  redAlignmentY;

    public OverlayLayoutTest()
    {
        setLayout( new BorderLayout(10, 10) );
        add(createNorthPanel(), BorderLayout.NORTH);
        add(createCenterPanel(), BorderLayout.CENTER);
        add(createSouthPanel(), BorderLayout.SOUTH);
    }

    private JPanel createNorthPanel()
    {
        JPanel panel = new JPanel();

        panel.add( new JLabel("Green:") );
        greenLabel = new JLabel();
        panel.add( greenLabel );

        panel.add( new JLabel("Red:") );
        redLabel = new JLabel();
        panel.add( redLabel );

        return panel;
    }

    private JPanel createCenterPanel()
    {

        JPanel panel = new JPanel();
        panel.setLayout( new OverlayLayout(panel) );
        panel.setBackground( Color.ORANGE );
        panel.setPreferredSize( new Dimension(200, 200) );

        red = new JPanel();
        red.setBackground( Color.RED );
        red.setPreferredSize( new Dimension(50, 50) );
        red.setMaximumSize( red.getPreferredSize() );
        red.setMinimumSize( red.getPreferredSize() );
        panel.add( red );

        green = new JPanel();
        green.setBackground( Color.GREEN );
        green.setPreferredSize( new Dimension(100, 100) );
        green.setMaximumSize( green.getPreferredSize() );
        green.setMinimumSize( green.getPreferredSize() );
        panel.add( green );

        JPanel wrap = new JPanel();
        wrap.add( panel );
        return wrap;
    }

    private JPanel createSouthPanel()
    {
        JPanel panel = new JPanel( new GridLayout(1, 0, 10, 10) );

        JPanel green = new JPanel(new GridLayout(0, 2, 5, 5) );
        green.setBorder( new TitledBorder("Green Alignment") );
        green.add( new JLabel("X Alignment:") );
        greenAlignmentX = createComboBox();
        green.add( greenAlignmentX );
        green.add( new JLabel("Y Alignment:") );
        greenAlignmentY = createComboBox();
        green.add( greenAlignmentY );
        panel.add( green );

        JPanel red = new JPanel(new GridLayout(0, 2, 5, 5) );
        red.setBorder( new TitledBorder("Red Alignment") );
        red.add( new JLabel("X Alignment:") );
        redAlignmentX = createComboBox();
        red.add( redAlignmentX );
        red.add( new JLabel("Y Alignment:") );
        redAlignmentY = createComboBox();
        red.add( redAlignmentY );
        panel.add( red );

        JButton reset = new JButton("Reset Alignment");
        reset.addActionListener( this );
        panel.add( reset );


        return panel;
    }

    public void actionPerformed(ActionEvent e)
    {
        green.setAlignmentX( ((Float)greenAlignmentX.getSelectedItem()) );
        green.setAlignmentY( ((Float)greenAlignmentY.getSelectedItem()) );
        red.setAlignmentX( ((Float)redAlignmentX.getSelectedItem()) );
        red.setAlignmentY( ((Float)redAlignmentY.getSelectedItem()) );
        JPanel parent = (JPanel)green.getParent();
        parent.revalidate();
/*
        System.out.print(green.getAlignmentX() + " : ");
        System.out.print(green.getAlignmentY() + " : ");
        System.out.print(red.getAlignmentX() + " : ");
        System.out.print(red.getAlignmentY() + " : ");
        System.out.println();
*/
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                greenLabel.setText( green.getLocation().toString() );
                redLabel.setText( red.getLocation().toString() );
            }
        });

    }

    private JComboBox createComboBox()
    {
        JComboBox<Float> comboBox = new JComboBox<Float>();

        comboBox.addItem( new Float(0f) );
        comboBox.addItem( new Float(0.25f) );
        comboBox.addItem( new Float(0.5f) );
        comboBox.addItem( new Float(0.75f) );
        comboBox.addItem( new Float(1.0f) );
        comboBox.setSelectedItem(0.5f);

        return comboBox;
    }

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

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
  1. 将两个组件的对齐X值设置为1.0

你应该得到你想要的布局。

编辑:

错过了拖动JInternalFrame的部分。因此,这意味着您正在使用JDesktopPane来支持拖动。JDesktopPane使用空布局来允许您拖动组件。

没有理由不能向桌面添加另一个组件(除了JInternalFrame)。您只需将此组件的大小/位置设置为显示在桌面的右上方。然后,您需要将一个ComponentListener添加到桌面窗格以监听ComponentResize事件。触发此事件时,您需要重新计算组件的位置,以将其重置到右上角。

 类似资料:
  • 问题内容: 我的应用程序的主要GUI由JDesktopPane组成,该JDesktopPane在框架的内容窗格的CENTER处使用BorderLayout。我希望在屏幕的右上方放置一个组件,该组件仍允许用户将JInternalFrames拖动到该组件的左侧和底部。 将组件设置为BorderLayout的NORTH或EAST似乎会填满整个空间。我以为BorderLayout可能不是我要完成的最佳布局

  • 我希望我的Javafx组件,如标签、单独包装在vbox中的文本字段,即使调整了大小,也保持在窗口的中心。请参阅附件中的图片。目前,这些成分包含在锚烷中。下面给出了FXML文件代码。请告诉我怎么做。谢谢 组件位于中间的小尺寸窗口的图像。 全尺寸窗口,但部件位置不变。

  • 从子组件对父组件执行setState的建议模式是什么? 我有一个todo项数组,它在父级状态下维护。我想从的组件访问父级状态并添加新的todo项。我的想法是在父对象上执行setState,这将呈现新添加的todo项。

  • 我想像这样向容器中添加一些使用javascript函数的红点和绿点: null null 我想将圆点从容器的左上角定位到右下角,如下所示:

  • 我想将我的两个组件与窗口的左上角对齐。 我想要左上角有数字的线条。 请注意,我知道JFrame(“this”类)和主面板都使用了边框布局。 另一个不相关的问题:我应该什么时候创建一个新的对象?为什么我不能在私有实例变量中存储一个用于所有需要的使用?

  • 我有一个主框架,我想用卡片布局在中心位置显示我的新用户类的对象。这里是我的主类 这是我的新用户类 我希望NewUser的对象显示在主类的中心位置