Java JScrollPane-多个组件
我试图在JScrollPane中添加两个图像。第一个图像是背景,第二个图像与第一个图像重叠。当我运行程序时,问题只显示第二个图像 请帮忙Java JScrollPane-多个组件,java,swing,jscrollpane,Java,Swing,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(
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 );
将两个标签放在同一面板中,并将其添加到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);
如果要使组件彼此重叠,请使用。JViewport是单个子容器,不能添加两个组件
要在任何容器中实现重叠(即在z方向上堆叠组件),您主要依靠自己,内置支持很差。要么在LayeredPane中管理它们(如前所述),要么尝试Overlayout这就是我为您的特定问题所做的 既然您说您有一个图像充当背景,那么我将覆盖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个组件分配给JScrollPane。“…遗漏了该部分…”有时我忙于编辑一篇文章,从一堆未格式化的代码到一些可读的东西,我会错过一些微妙的细节。难以区分“森林和树木”。)顺便说一句,谢谢你让这篇文章更具可读性,这样其他人(比如我)就可以发现那些更精细的细节了。:)标题没有提到重叠要求,我也没有搜索重叠的东西,所以+1回答了我搜索的目的。+1@kleopatra重叠布局看起来是一个非常有用的管理器。谢谢,我不知道。它可以很好地用来解决这个问题。