有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing Java JScrollPane多个组件

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

请帮忙

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 );

共 (2) 个答案

  1. # 1 楼答案

    这就是我为你的特殊问题所做的

    既然你说你有一个图像作为背景,所以我会覆盖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);
        }
    }
    

    注意:图像是URL,因此运行该示例需要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:滚动窗格设置PreferedSize的唯一原因是,您可以看到滚动条。否则不要使用它,让布局控制滚动窗格

  2. # 2 楼答案

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

    为了在任何容器中实现重叠(即在z方向上堆叠组件),您主要依靠自己,内置支持很差。要么必须在LayeredPane(如前所述)中管理它们,要么尝试重叠布局