하지만 난 그것의 맨 위에 아무 것도 추가하면 내가 추가하고 당신이 필요
오른쪽으로 차단 구성 요소의 폭에 의해 이미지를 우측으로 이동 두 구성 요소의 alignmentX/Y 속성을 사용하여 원하는 레이아웃을 얻으십시오.
모두 0.5f로 설정합니다.
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();
}
});
}
}
또 다른 옵션은 단지 당신이 원하는대로에 JLabel의 (가 BorderLayout, GridBagLayout을, FlowLayout에의 레이아웃을 설정하는 것입니다 : 여기
는 효과를 볼 수있는 속성을 변경할 수있는 작은 데모 프로그램입니다). 그런 다음 패널과 마찬가지로 구성 요소를 레이블에 직접 추가 할 수 있습니다. 추가하는 모든 구성 요소는 레이블 내에 완전히 포함되어야합니다. 이렇게하면 OverlayLayout을 사용하는 것보다 더 많은 유연성을 얻을 수 있습니다.
들여 쓰기 코드 행과 블록의 논리적이고 일관된 형식을 사용하십시오. 들여 쓰기는 코드의 흐름을 따라 가기 쉽도록 만들어졌습니다. –
1) BTW - 왜 3 가지 이전 질문이 답변에 포함되어 있습니까? 문제를 해결하는 데 도움이된다면 [답변 수락] (http://meta.stackexchange.com/a/5235/155831)을주십시오. 2) * "프레임의 크기를 이미지의 크기와 같게 설정합니다."* 너무 작아 전체 이미지를 표시 할 수 없습니다. 프레임 장식을 고려해야합니다. –
@AndrewThompson 그 위에 아무것도 넣지 않으면 이미지가 완벽하게 맞습니다. –