gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:26:58 24 4
gpt4 key购买 nike

我的应用程序的主要 GUI 由使用 BorderLayout 的框架内容 Pane 中心的 JDesktopPane 组成。我希望在屏幕右上角放置一个组件,仍然允许用户将 JInternalFrames 拖动到该组件左侧和底部的空间内。

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

最佳答案

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

您需要操作 setAlignmentX(..) 和 setAlignmentY(...)` 方法来获得您想要的布局。这些对齐方式如何协同工作并不总是直观的,但将组件设置到顶部/左侧相对容易。

这里有一个小演示供您使用:

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
  2. 将两个组件的对齐 Y 值设置为 0.0

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

编辑:

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

您没有理由不能向桌面添加其他组件(JInternalFrame 除外)。您只需设置该组件显示在桌面右上角的大小/位置即可。然后,您需要将 ComponentListener 添加到桌面 Pane 以监听 componentResized 事件。触发此事件时,您需要重新计算组件的位置以将其重置到右上角。

关于Java 布局,组件始终位于右上角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38703262/

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