2012-05-01 2 views
2

JLayeredPane에 문제가 있습니다. 매우 간단하지만 매우 놀랍습니다. 내 머리를 감쌀 수 없습니다. 내가 가진 문제는 모든 구성 요소가 함께 병합되고 주문이 없다는 것입니다. 너는 잘 모르겠다. 내가하려고 순서는이JLayeredPane 서식 지정 문제


출력 (앞)


LABEL1 (뒤)
입력


import java.awt.BorderLayout; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.io.IOException; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

public class window extends JFrame implements KeyListener { 
/** 
* 
*/ 
private static final long serialVersionUID = 7092006413113558324L; 
private static int NewSize; 
public static String MainInput; 
public static JLabel label1 = new JLabel(); 
public static JTextField input = new JTextField(10); 
public static JTextArea output = new JTextArea(main.Winx, NewSize); 

public window() { 
    super("Satine. /InDev-01/"); 
    JLabel label1; 
    NewSize = main.Winy - 20; 
    setLayout(new BorderLayout()); 
    output.setToolTipText(""); 
    add(input, BorderLayout.PAGE_END); 
    add(output, BorderLayout.CENTER); 
    input.addKeyListener(this); 
    input.requestFocus(); 
    ImageIcon icon = new ImageIcon("C:\\Users\\" + System.getProperty("user.name") + "\\AppData\\Roaming\\.Satine\\img\\textbox.png", "This is the desc"); 
    label1 = new JLabel(icon); 
    add(label1, BorderLayout.PAGE_END); 
} 
public void keyPressed(KeyEvent e) { 
    int key = e.getKeyCode(); 
    if (key == KeyEvent.VK_ENTER) { 
     try { 
      MainMenu.start(); 
     } catch (IOException e1) { 
      System.out.print(e1.getCause()); 
     } 
    } 
} 


@Override 
public void keyReleased(KeyEvent e) { 
} 

@Override 
public void keyTyped(KeyEvent e) { 
} 

} 

과 같은 레이아웃을 가지고있다 메인 클래스. 내가 원하는 건 내가 잘못 가고 위치에 대한 팁입니다

import java.awt.Container; 
import java.io.IOException; 

import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 


public class main { 
public static int Winx, Winy; 
private static JLayeredPane lpane = new JLayeredPane(); 
public static void main(String[] args) throws IOException{ 
    Winx = window.WIDTH; 
    Winy = window.HEIGHT; 
    window Mth= new window(); 
    Mth.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Mth.setSize(1280,720); 
    Mth.setVisible(true); 
    lpane.add(window.label1); 
    lpane.add(window.input); 
    lpane.add(window.output); 
    lpane.setLayer(window.label1, 2, -1); 
    lpane.setLayer(window.input, 1, 0); 
    lpane.setLayer(window.output, 3, 0); 
    Mth.pack(); 
} 
    } 

는 시간 내 주셔서 감사하고 나는 코드가 나를 위해 기록 할 것으로 예상하지 않는다.

+0

오버레이를 필요로하는 곳에 왜 그냥 섹션에서는 GUI의 바닥 부분에서의 JLayeredPane를 사용할 수 있습니까? 또한, 왜 JLayeredPane에 컴포넌트를 두 번 추가하는 것처럼 보입니까? 나는'setLayer (...) '메서드를 사용한 적이 없으며 왜 당신이 맞는지 확신 할 수 없다. 왜 단순히'add (Component, Integer)'오버로드를 호출하지 않는가? –

+0

무슨 뜻인지 알지만 어떻게 나눌까요? – Koala

+0

? 어떻게 나누겠습니까? BoxLayout와 같이 전체 GUI에 다른 레이아웃을 사용하고 topp에 출력을 추가하고 JLayeredPane을 맨 아래에 추가 한 다음 JLayeredPane에 컴포넌트를 한 번만 추가하면됩니다. –

답변

4

GUI의 전체 레이아웃으로 JLayeredPane을 사용하지 않는 것이 좋습니다. BoxLayout 또는 BorderLayout을 사용하고 레이어가 필요한 곳에서만 JLayeredPane을 사용하십시오. 또, JLayeredPane에 컴퍼넌트를 추가 할 때는, Component와 Integer를 취하는 add 메소드를 사용합니다. add(...)에 전화하지 말고 setLayer(...)으로 전화하지 마십시오.

수정 : setLayer(...)을 사용하는 것이 좋습니다. 필자는 전에 이것을 사용 해본 적이 없지만 API에 따라 레이어를 설정하는 방법 중 하나입니다.

예를 들어,

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridBagLayout; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.*; 

public class LayeredPaneFun extends JPanel { 
    public static final String IMAGE_PATH = "http://duke.kenai.com/" + 
     "misc/Bullfight.jpg"; 

    public LayeredPaneFun() { 
     try { 
     BufferedImage img = ImageIO.read(new URL(IMAGE_PATH)); 
     ImageIcon icon = new ImageIcon(img); 
     JLabel backgrndLabel = new JLabel(icon); 
     backgrndLabel.setSize(backgrndLabel.getPreferredSize()); 

     JPanel forgroundPanel = new JPanel(new GridBagLayout()); 
     forgroundPanel.setOpaque(false); 

     JLabel fooLabel = new JLabel("Foo"); 
     fooLabel.setFont(fooLabel.getFont().deriveFont(Font.BOLD, 32)); 
     fooLabel.setForeground(Color.cyan); 
     forgroundPanel.add(fooLabel); 
     forgroundPanel.add(Box.createRigidArea(new Dimension(50, 50))); 
     forgroundPanel.add(new JButton("bar")); 
     forgroundPanel.add(Box.createRigidArea(new Dimension(50, 50))); 
     forgroundPanel.add(new JTextField(10)); 
     forgroundPanel.setSize(backgrndLabel.getPreferredSize()); 

     JLayeredPane layeredPane = new JLayeredPane(); 
     layeredPane.setPreferredSize(backgrndLabel.getPreferredSize()); 
     layeredPane.add(backgrndLabel, JLayeredPane.DEFAULT_LAYER); 
     layeredPane.add(forgroundPanel, JLayeredPane.PALETTE_LAYER); 

     setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
     add(new JScrollPane(new JTextArea("Output", 10, 40))); 
     add(layeredPane); 

     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     System.exit(1); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     System.exit(1); 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("LayeredPaneFun"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new LayeredPaneFun()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+1

글쎄, 당신은 내가 전에 올려 놓지 않았 으면 좋겠다. 나는 다른 것을 가질 수 있니? –

+1

JLayer를 사용하는 시간 (eeeerrrght Jeanette은 다시 강하다)이라고 생각합니다. JLayer를 사용하는 시간 (더 좋고 안전한 --->) 또는 JLayer에서 Java7로 축소 된 구현 – mKorbel