美好的一天!
是否可以在 JLabel 之上添加 JPanel?
我希望我的 JFrame 有背景图片,为此,我使用了这段代码(基于过去的 stackoverflow 答案):
setLocation(150,50);
setSize(700,650);
setVisible(true);
JLabel contentPane = new JLabel();
contentPane.setIcon(new ImageIcon("pics/b1.jpg"));
contentPane.setLayout( new BorderLayout());
setContentPane( contentPane );
现在我的问题是,由于 JLabel 背景,我无法在我的 JFrame 上放置面板。 请帮忙。
谢谢。
最佳答案
要为 JFrame 创建背景图像,我建议您在 JPanel 的 paintComponent 方法中绘制图像,然后将此 JPanel 添加到填充 contentPane 的 contentPane BorderLayout.CENTER。您甚至可能希望将 JPanel 的 preferredSize 设置为图像的首选大小。然后您可以将任何您想要的组件添加到图像面板,而不必担心尝试将组件添加到 JLabel,这对我来说似乎很糟糕。
例如,这是一个执行此操作但略有不同的程序。它创建一个 ImagePanel 对象,一个 JPanel,它绘制图像并根据图像调整自身大小,然后将其放置在 JScrollPane 中,然后将其添加到 contentPane 中,但是您可以摆脱 JScrollPane 并将图像 JPanel 直接放在contentPane 改为:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
public class BigDukeImage {
public static final String IMAGE_PATH = "http://" + "duke.kenai.com/nyanya/NyaNya.jpg";
private static final Dimension SCROLLPANE_SIZE = new Dimension(900, 700);
private static void createAndShowUI() {
Image image = null;
try {
URL url = new URL(IMAGE_PATH);
image = ImageIO.read(url);
// JLabel label = new JLabel(new ImageIcon(image));
ImagePanelA imagePanel = new ImagePanelA(image);
JScrollPane scrollpane = new JScrollPane();
// scrollpane.getViewport().add(label);
scrollpane.getViewport().add(imagePanel);
scrollpane.setPreferredSize(SCROLLPANE_SIZE);
JFrame frame = new JFrame("Big Duke Image");
frame.getContentPane().add(scrollpane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
JScrollBar vertSBar = scrollpane.getVerticalScrollBar();
JScrollBar horzSBar = scrollpane.getHorizontalScrollBar();
vertSBar.setValue((vertSBar.getMaximum() - vertSBar.getVisibleAmount()) / 2);
horzSBar.setValue((horzSBar.getMaximum() - horzSBar.getVisibleAmount()) / 2);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
@SuppressWarnings("serial")
class ImagePanelA extends JPanel {
private Image image;
public ImagePanelA(Image image) {
this.image = image;
setPreferredSize(new Dimension(image.getWidth(null), image.getHeight(null)));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
g.drawImage(image, 0, 0, null);
}
}
}
关于java - JLabel 之上的 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5079486/