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();
}
});
}
}
- は、両方のコンポーネントのために0.0にアライメントY値を設定し、両方のコンポーネント
- のために1.0にアライメントX値を設定
あなたが望むレイアウトを取得する必要があります。
編集:
はJInternalFrameのドラッグについての一部を逃しました。このため、JDesktopPaneを使用してドラッグをサポートしています。 JDesktopPaneはnullレイアウトを使用して、コンポーネントをドラッグできます。
デスクトップに別のコンポーネント(JInternalFrame以外)を追加することはできません。このコンポーネントのサイズ/位置をデスクトップの右上に表示するように設定するだけです。 をデスクトップペインに追加して、componentResized
イベントを待機する必要があります。このイベントが発生すると、右上にリセットするためにコンポーネントの位置を再計算する必要があります。
1つのコンポーネントが右上に置かれた後に残っている_non-rectangular_スペースをすべて使用するレイアウトマネージャーを求めていますか?私はSwingについてよく分かりませんが、 'javax.swing.SpringLayout'を使う方法があるかどうかを見ていきます。 –
@jameslargeこれは正しかったです。ありがとうございます。 – Tommo
'BorderLayout'の' PAGE_START'に 'FlowLayout'を右寄せします(パネルにa)。フローレイアウトを使用して、右上に配置されたコンポーネントをパネルに追加します。 –