Java JScrollPane-多个组件

时间:2011-04-30 06:38:54

标签: java swing jscrollpane

我正在尝试在JScrollPane中添加2个图像。第一个图像是背景,第二个图像与第一个图像重叠。当我运行程序时,问题只显示第二张图像!

请帮助

ImageIcon ii = new ImageIcon("mini_map.png");
JLabel label1=new JLabel(ii);

Icon icon = new ImageIcon("Mg.gif");
JLabel label2 = new JLabel(icon);

JScrollPane jsp=new JScrollPane();

jsp.getViewport().add(label1);
jsp.getViewport().add(label2 );

4 个答案:

答案 0 :(得分:6)

JViewport是一个单子容器,不能添加两个组件。

要在任何容器中实现重叠(即z方向的堆栈组件),主要由您自己完成,内置支持很差。要么必须在LayeredPane中管理它们(如前所述),要么尝试OverlapLayout

答案 1 :(得分:5)

如果您希望将组件放在彼此之上,请使用layered pane

答案 2 :(得分:4)

将两个标签放在同一个面板中,并将其添加到JScrollPane:

ImageIcon ii = new ImageIcon("mini_map.png");
JLabel label1=new JLabel(ii);

Icon icon = new ImageIcon("Mg.gif");
JLabel label2 = new JLabel(icon);

JPanel pContainer = new JPanel();
pContainer.add(label1);
pContainer.add(label2);
JScrollPane jsp=new JScrollPane(pContainer);

答案 3 :(得分:3)

这就是我为你的特定问题做的事情。

因为你说你有一个图像作为背景的角色,所以我会覆盖paintComponent(),如下面的BackgroundPanel。 这样您就可以使用仅作为背景的面板。你可以添加任何类型的组件,在你的情况下添加一个带有ImageIcon的JLabel。

通过这种方式,您可以使用布局管理器来控制组件的位置。

如果您的问题更复杂,或者您希望一般将组件设置为另一个,那么就像所有人在这里说的那样--->使用JLayeredPane。请注意,如果您使用JLayeredPane,布局管理器将无法帮助您,因为它不会尊重它们。您将不得不继续使用空管理器,即组件的setBounds()。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class PaintInScroll
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                try
                {
                    Image backgroundImage = new ImageIcon(new URL(
                            "http://www.jvsearch.com/adidocs7_images/JAVAORANGE.JPG")).getImage();
                    BackgroundPanel bP = new BackgroundPanel(backgroundImage);
                    bP.setLayout(new BorderLayout());
                    bP.setPreferredSize(new Dimension(500, 500));
                    JLabel label = new JLabel(new ImageIcon(new URL(
                            "https://blogs.oracle.com/theplanetarium/resource/thumb-java-duke-guitar.png")));
                    bP.add(label, BorderLayout.CENTER);
                    JScrollPane scrollPane = new JScrollPane(bP);
                    scrollPane.setPreferredSize(new Dimension(300, 400));
                    JPanel contentPane = new JPanel();
                    contentPane.add(scrollPane);
                    JFrame f = new JFrame();
                    f.setContentPane(contentPane);
                    f.setSize(800, 600);
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    f.setVisible(true);
                }catch(MalformedURLException ex)
                {
                    Logger.getLogger(PaintInScroll.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }
}

class BackgroundPanel extends JPanel
{
    private Image image;

    public BackgroundPanel(Image image)
    {
        this.image = image;
    }
    private static final long serialVersionUID = 1L;

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);
    }
}

注意:图片是网址,因此运行该示例需要i-net连接。

EDIT1:示例显示如何使用JLayeredPane为每个图层使用布局管理器。

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class PaintInScrollRespectingLayoutManagers extends JPanel
{
    private static final long serialVersionUID = 1L;
    private JLayeredPane layeredPane;
    private JLabel imageContainer = new JLabel();
    private JButton infoB = new JButton("i");
    private JScrollPane scrollPane;

    public PaintInScrollRespectingLayoutManagers(ImageIcon image)
    {
        super();
        this.imageContainer.setIcon(image);
        scrollPane = new JScrollPane(imageContainer);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setPreferredSize(new Dimension(125, 90));
        JPanel iSPP = new JPanel();//image scroll pane panel
        iSPP.setOpaque(false);
        iSPP.add(scrollPane);
        JPanel iBP = new JPanel();//info button panel
        iBP.setOpaque(false);
        iBP.add(infoB);
        this.layeredPane = new JLayeredPane();
        layeredPane.add(iSPP, new Integer(50));
        layeredPane.add(iBP, new Integer(100));
        this.setLayout(new BorderLayout());
        this.add(layeredPane, BorderLayout.CENTER);
        this.add(new JButton("A button"), BorderLayout.SOUTH);
        layeredPane.addComponentListener(layeredPaneCL);
        setPreferredSize(new Dimension(300, 300));
    }
    private ComponentListener layeredPaneCL = new ComponentAdapter()
    {
        @Override
        public void componentResized(ComponentEvent e)
        {
            super.componentResized(e);
            System.out.println("componentResized");
            for(Component c : layeredPane.getComponents())
                c.setSize(layeredPane.getSize());
        }
    };

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                try
                {
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new PaintInScrollRespectingLayoutManagers(new ImageIcon(new URL(
                            "http://www.prodeveloper.org/wp-content/uploads/2008/10/stackoverflow-logo-250.png"))));
                    frame.pack();
                    frame.setVisible(true);
                }catch(MalformedURLException ex)
                {
                    Logger.getLogger(PaintInScrollRespectingLayoutManagers.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }
}

注意2:滚动窗格具有setPrefferedSize的唯一原因是您可以看到滚动条。否则不要使用它让布局负责控制滚动窗格。