2011-10-02 6 views
2

같은 컨테이너에 두 개의 JPanel이 서로 겹쳐서 있습니다. container.add (jpanel, 0);을 사용하고 있습니다. 및 container.add (otherjpanel, 1). 그러나 최상위 레이어가 마우스로 구성 요소 위로 마우스를 올려 놓아야한다는 것을 보여주기 위해 잘 작동합니다.구성 요소 레이어링 Java 스윙, 호버에 표시되는 레이어

여기 내 문제를 보여주는 실행 코드가 있습니다.

화면 상단에 마우스를 올려 놓기 만하면됩니다.

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

public class test { 


    public static void main(String args[]) { 
    try { 
    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
    } catch (Exception e) {} 



    JFrame frame = new GUIframe(); 
    frame.setVisible(true); 
    frame.setResizable(false); 

    } 
} 



class GUIframe extends JFrame{ 


public GUIframe(){ 

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setPreferredSize(new Dimension(300,400)); 
     setSize(300, 400); 

     JLayeredPane content = new JLayeredPane(); 

     content.setPreferredSize(new Dimension(300,400)); 

     content.setSize(300,400); 

     JPanel board = new JPanel(); 

     for (int i = 0;i<5;i++){ 

     JButton button = new JButton("button"); 
     board.add(button); 

     } 

     content.add(new ImagePanel()); 
     this.add(content); 
     this.add(board); 


} 
} 

class ImagePanel extends JPanel { 

    private Image img; 
    String imageLocation = "image location here"; 

    ImagePanel() { 
    img = new ImageIcon(imageLocation).getImage(); 
    setPreferredSize(new Dimension(300,400)); 
    setSize(300,400); 
    setLayout(null); 
    setOpaque(false); 

    } 

    public void paint(Graphics g){ 

    super.paint(g); 
    g.drawImage(img, 0, 0, this); 

    } 

} 
+1

1) 빨리 더 도움 들어, [SSCCE] (http://pscode.org/sscce.html) 2) 스윙에서 비 TLCS, 재정'의 paintComponent (그래픽)'이 아닌'페인트를 게시 (그래픽)'. –

답변

2

기본적으로 contentPane의 레이아웃은 BorderLayout입니다. 이걸 바꿨 니? 아마도 contentPane을 JLayeredPane으로 설정해야합니다.

이 권장 사항에 대해 명확하지 않은 사항이 있으면 의견을 남기십시오.

편집 : 1의 JLayeredPane의 예 당신은 내가 설명 된대로 계층화 구획, 아래처럼 뭔가 이런 종류의 물건을 해결할 수 있지만, 크기를 설정하고 놓인 JPanel의이 불투명하기 위해주의를 기울여야한다
: 당신이 원하는 모든 배경 이미지 인 경우

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
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 Test2 { 
    private static final int LP_WIDTH = 450; 
    private static final int LP_HEIGHT = 600; 
    private static final String IMAGE_SITE = "http://upload.wikimedia.org/wikipedia/" 
     + "commons/thumb/b/b8/Laser_Towards_Milky_Ways_Centre.jpg/" 
     + "660px-Laser_Towards_Milky_Ways_Centre.jpg"; 
    private JLayeredPane layeredPanel = new JLayeredPane(); 

    public Test2() { 
     layeredPanel.setPreferredSize(new Dimension(LP_WIDTH, LP_HEIGHT)); 
     try { 
     URL url = new URL(IMAGE_SITE); 
     BufferedImage image = ImageIO.read(url); 
     ImagePanel2 imagePanel2 = new ImagePanel2(image); 
     imagePanel2.setSize(layeredPanel.getPreferredSize()); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setOpaque(false); 
     for (int i = 0; i < 8; i++) { 
      buttonPanel.add(new JButton("Button")); 
     } 
     buttonPanel.setSize(layeredPanel.getPreferredSize()); 

     layeredPanel.add(imagePanel2, JLayeredPane.DEFAULT_LAYER); 
     layeredPanel.add(buttonPanel, JLayeredPane.PALETTE_LAYER); 
     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
     } 
    } 

    private JComponent getMainComponent() { 
     return layeredPanel; 
    } 

    private static void createAndShowGui() { 
     Test2 test2 = new Test2(); 

     JFrame frame = new JFrame("Test2"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(test2.getMainComponent()); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

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

class ImagePanel2 extends JPanel { 
    private Image image; 

    public ImagePanel2(Image image) { 
     this.image = image; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (image != null) { 
     g.drawImage(image, 0, 0, null); 
     } 
    } 

} 

그러나, 그 다음은 내가 할 배경 이미지를 사용하는 JPanel의를 만든 다음에 물건을 추가 할 것거야.

import java.awt.*; 
import java.awt.image.*; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

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

public class Test3 extends JPanel { 
    private static final int LP_WIDTH = 450; 
    private static final int LP_HEIGHT = 600; 
    private static final String IMAGE_SITE = "http://upload.wikimedia.org/wikipedia/" 
     + "commons/thumb/b/b8/Laser_Towards_Milky_Ways_Centre.jpg/" 
     + "660px-Laser_Towards_Milky_Ways_Centre.jpg"; 

    private BufferedImage image; 

    public Test3() { 
     try { 
     URL url = new URL(IMAGE_SITE); 
     image = ImageIO.read(url); 

     for (int i = 0; i < 8; i++) { 
      add(new JButton("Button")); 
     } 
     } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(LP_WIDTH, LP_HEIGHT); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (image != null) { 
     g.drawImage(image, 0, 0, null); 
     } 
    } 

    private static void createAndShowGui() { 
     Test3 mainPanel = new Test3(); 

     JFrame frame = new JFrame("Test3"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

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

아니요 변경하지는 않았지만 구성 요소 다음에 int를 사용하여 레이어를 만들 수 있습니다. – user541597

+0

당신은 이미 자신을위한 해답을 발견했습니다. 나 자신, 나는 이것을 위해 JLayeredPane을 사용할 것이고, 오라클이 가지고있는 괜찮은 튜토리얼을 따르겠다 : [JLayeredPane Tutorial] (http://download.oracle.com/javase/tutorial/uiswing/components/layeredpane. html). 계층화 된 구획은 add 메소드의 두 번째 매개 변수로 * Integer *를 사용합니다. –

+0

컨테이너를 jlayeredpane으로 변경하면 gui에 아무 것도 표시되지 않습니다. – user541597