我的应用程序的主要GUI由JDesktopPane组成,该JDesktopPane在框架的内容窗格的CENTER处使用BorderLayout。我希望在屏幕的右上方放置一个组件,该组件仍允许用户将JInternalFrames拖动到该组件的左侧和底部。
将组件设置为BorderLayout的NORTH或EAST似乎会填满整个空间。我以为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();
}
});
}
}
您应该得到想要的布局。
编辑:
缺少有关拖动JInternalFrame的部分。因此,您使用JDesktopPane来支持拖动。JDesktopPane使用空布局允许您拖动组件。
没有理由不能将其他组件(JInternalFrame除外)添加到桌面。您只需要设置此组件的大小/位置即可在桌面右上角显示。然后,您需要将a添加ComponentListener
到桌面窗格以侦听componentResized
事件。触发此事件后,您需要重新确定组件的位置才能将其重置为右上角。
我的应用程序的主要GUI由一个JDesktopPane组成,它位于框架内容窗格的中心,使用BorderLayout。我希望在屏幕的右上角放置一个组件,它仍然允许用户将空间中的JinternalFrame拖动到该组件的左下角。 将构件设置为BorderLayout的北部或东部似乎会填充整个空间。我想BorderLayout可能不是我想要实现的最好的布局管理器?对更好的方法有什么建议吗?
我希望我的Javafx组件,如标签、单独包装在vbox中的文本字段,即使调整了大小,也保持在窗口的中心。请参阅附件中的图片。目前,这些成分包含在锚烷中。下面给出了FXML文件代码。请告诉我怎么做。谢谢 组件位于中间的小尺寸窗口的图像。 全尺寸窗口,但部件位置不变。
我有一个主框架,我想用卡片布局在中心位置显示我的新用户类的对象。这里是我的主类 这是我的新用户类 我希望NewUser的对象显示在主类的中心位置
问题内容: 我正在为我的学生编写MathQuiz,包括用于渲染的JLatexMath和用于蜂鸣器的jinput。问题是,有时(像每四次一样)当我启动程序时,所有组件都不可见。它们在调整JFrame大小后出现。首先,我想到了jinput或jlatexMath库中的Bug,但是即使使用最小的代码,我也会遇到相同的错误: 代码有什么问题? 问题答案: 首先移到构造函数的末尾。 而不是去这里… 移到这里…
我们拓展了基础组件的概念, 创造出了布局组件. 例子 const Grid = (props) => ( <Box {...props} display='inline-block' verticalAlign='top' px={2}/> ); const Half = (props) => ( <Grid {...props} width={1 / 2}
布局是开发 Web 页面最常接触的一个方面,也是页面最直观的一种展现方式。然而在开发前端页面的时候很多工程师会为布局感到头疼,不仅是因为不同浏览器厂商兼容程度的不同,而且还有诸多如适配不同分辨率屏幕所带来的问题、实现起来比较复杂的问题等种种情况。不过在使用了 MIP 之后我们不需要再为这些问题烦恼,MIP 提供了一整套完备的组件布局系统,支持不同布局类型和方式,开发者需要做的仅仅是为组件指定布局属