2011-10-02 106 views
2

我有两个JPanel层叠在同一个容器中。我正在使用container.add(jpanel,0);和container.add(otherjpanel,1)。它工作正常,但为了顶层显示我必须用鼠标悬停在组件上。组件分层Java Swing,图层显示在悬停上

这是一些可执行的代码,显示我的问题。

只需将鼠标悬停在屏幕上部。

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)在Swing非薄层扫描法,超控'的paintComponent(图形)'而不是'涂料(图形)'。 –

回答

2

contentPane的布局默认是BorderLayout。你有没有改变这个?也许你应该将你的contentPane设置为JLayeredPane。

如果对此建议有任何疑问,请留下评论。

编辑1:JLayeredPane的实例
你可以解决这样的事情与我描述的分层的窗格中,像下面列出,但是你必须小心设置大小和使覆JPanels非不透明:

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做这件事,我会遵循Oracle为此提供的体面教程:[JLayeredPane教程](http://download.oracle.com/javase/tutorial/uiswing/components/layeredpane。 HTML)。请注意,分层窗格不会将* Integer *作为其add方法的第二个参数。 –

+0

如果我将容器更换为jlayeredpane,gui上没有任何显示。 – user541597