2014-07-15 67 views
0

我试图在部分成功的情况下将JPanel添加到JLayeredPane。我能够分别看到两个面板,但不能在将它们添加在一起时看到。当我把它们放在一起时,只有DEFAULT_LAYER显示。任何想法都会很棒。向JLayeredPane添加两个JPanel

import java.awt.image.BufferedImage; 
import javax.swing.JPanel; 
import javax.swing.JLabel; 
import javax.swing.JScrollPane; 
import javax.swing.ImageIcon; 
import javax.swing.JLayeredPane; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.*; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridBagLayout; 
import java.awt.GridBagConstraints; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.Container; 
import java.awt.Component; 
import java.awt.Insets; 
import java.util.ArrayList; 
import java.awt.LayoutManager; 

public class ImageEditorView 
{ 
    public static int dimensionWidth = 1280; 
    public static int dimensionHeight = 640; 
    private Color currentColor = Color.WHITE; 
    private JLayeredPane layeredPane; 

    private JPanel createEditPanel() 
    { 
     final CirclePanel editPanel = new CirclePanel(); 
     //editPanel.setLayout(new CircleLayout(true)); 

     editPanel.setBounds(50, 0, 150, 150); 
     editPanel.setOpaque(true); 

     return editPanel; 
    } 

    private JPanel createImageView() 
    { 
     JPanel imageView = new JPanel(new GridBagLayout()); 
     imageView.setPreferredSize(new Dimension(dimensionWidth, dimensionHeight)); 
     imageView.setBounds(0, 0, dimensionWidth, dimensionHeight); 
     imageView.setBackground(currentColor); 
     return imageView; 
    } 

    private void addToLayeredPane(JComponent component, int level) 
    { 
     //This prints out what is expected. values of 1 and 100 respectfully 
     System.out.println("The level has a value of " + level); 
     layeredPane.add(component, level); 
    } 

    public void createAndShowGUI() 
    { 
     JFrame f = new JFrame("ImageEditor"); 
     f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     f.setLocationByPlatform(true); 

     layeredPane = new JLayeredPane(); 
     //Both createImageView and createEditPanel return with the type JPanel 
     addToLayeredPane(createImageView(), JLayeredPane.DEFAULT_LAYER); 
     addToLayeredPane(createEditPanel(), JLayeredPane.PALETTE_LAYER); 

     f.setSize(dimensionWidth, dimensionHeight); 
     f.setContentPane(layeredPane); 
     f.setMinimumSize(f.getSize()); 
     f.setVisible(true); 
    } 
} 

class CirclePanel extends JPanel 
{ 
    @Override 
    protected void paintComponent(Graphics g) 
    { 
     g.drawOval(0, 0, g.getClipBounds().width, g.getClipBounds().height); 
    } 
} 

回答

2

默认情况下,JPanel是不透明的。因此,您只会看到已添加到顶层的面板。请尝试:

panel.setOpaque(false); 

在顶部面板上。

如果您需要更多帮助,请发布适当的SSCCE来证明问题。您发布的代码不能编译,因此不可执行。

编辑:

的问题是你的addToLayeredPane(...)方法。您正在使用“int”图层参数。它需要是Integer

由于您使用int值添加组件,因此该组件通常会添加到面板中,并且会绘制在其ZOrder中,这基本上意味着添加的最后一个组件被首先绘制,因此您的“imageview”被绘制在“编辑视图”。

另外,您仍然没有按照我的建议在“editpanel”上使用setOpaque(false)。该代码只会显示工作,因为你没有正确地进行自定义绘画。您应该始终在绘画方法开始时调用super.paintComponent(g)。这会自动绘制背景,这就是为什么你需要使面板透明。

+0

我试过你的建议,没有骰子。我编辑了代码并添加了其余部分,以便编译,以供参考。 – acampb311

+0

'我编辑了代码并添加了其余的代码,以便编译'yes,但由于您没有添加main()方法,因此它不可执行。使代码完整,所以我们需要做的就是复制/粘贴/编译/执行!无论如何,请参阅编辑真正的问题。 – camickr

+0

对不起,这里有新东西,很匆忙,我感谢你的帮助。 – acampb311