2016-10-15 6 views
1

오버레이 레이아웃이있는 JFrame이 있습니다. 배경 이미지로 JLabel을 설정하고 그 위에 물건을 넣기를 원합니다. 프레임의 크기를 이미지의 크기와 같게 설정하고 그 위에 넣을 때 완벽하게 맞 춥니 다. 그러나 그 위에 아무 것도 추가하면 이미지가 오른쪽에 추가되는 구성 요소의 너비만큼 이동합니다 그것을 오른쪽으로 자른다. 구성 요소가 이동 된 영역에 있지 않더라도이 작업을 수행합니다. 구성 요소는 오른쪽에 있으며 레이블 위에 제대로 표시되지만 이미지는 계속 이동합니다.오버레이 레이아웃이 배경 이미지 레이블을 이동하지 못하도록 함

import java.awt.*;  
    import java.*; 
    import java.io.*; 
    import javax.swing.*; 
    import javax.swing.text.*; 
    import java.awt.event.*; 
    import javax.imageio.*; 
    import java.awt.image.*; 

    public class MainScreen extends JFrame{ 
     JButton button; 
     JPanel backgroundPanel, p, panel; 

     public MainScreen(ArrayList<Character> c){     
     JLabel label = new JLabel(new ImageIcon("house.jpg")); 
     button = new JButton("Button"); 

     backgroundPanel = new JPanel(); 
     p = new JPanel(); 
     panel = new JPanel(); 

     p.add(button); 
     panel.add(p); 

     panel.setOpaque(false); 
     p.setOpaque(false); 

     LayoutManager overlay = new OverlayLayout(backgroundPanel); 
     backgroundPanel.setLayout(overlay); 

     backgroundPanel.add(panel); 
     backgroundPanel.add(label);   

     add(backgroundPanel);  
     setLocationRelativeTo(null);     
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setResizable(false); 
     setSize(1200, 700); 
     setVisible(true); 
     } 

     public static void main(String[] args){ 
     MainScreen ms = new MainScreen(new ArrayList<Character>()); 
     } 
    } 
+1

들여 쓰기 코드 행과 블록의 논리적이고 일관된 형식을 사용하십시오. 들여 쓰기는 코드의 흐름을 따라 가기 쉽도록 만들어졌습니다. –

+0

1) BTW - 왜 3 가지 이전 질문이 답변에 포함되어 있습니까? 문제를 해결하는 데 도움이된다면 [답변 수락] (http://meta.stackexchange.com/a/5235/155831)을주십시오. 2) * "프레임의 크기를 이미지의 크기와 같게 설정합니다."* 너무 작아 전체 이미지를 표시 할 수 없습니다. 프레임 장식을 고려해야합니다. –

+0

@AndrewThompson 그 위에 아무것도 넣지 않으면 이미지가 완벽하게 맞습니다. –

답변

1

하지만 난 그것의 맨 위에 아무 것도 추가하면 내가 추가하고 당신이 필요

오른쪽으로 차단 구성 요소의 폭에 의해 이미지를 우측으로 이동 두 구성 요소의 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을 사용하는 것보다 더 많은 유연성을 얻을 수 있습니다.