Java JFrame包()问题
我试图使用标准java实用程序将图像覆盖在背景图像之上。请看下面的图片 我有一些代码似乎可以创建背景图像(你能验证它是否真的有效吗?) 我还创建了一个JPanel扩展,用于显示图像(该类称为ImagePanel) 但是,当程序启动时,JFrame只显示第二个图像,然后随着窗口大小的调整而移动 我想有一个窗口打开与背景图像占据了整个窗口的空间最初。然后,我希望在顶部指定的位置显示第二个图像Java JFrame包()问题,java,user-interface,image,background-image,packing,Java,User Interface,Image,Background Image,Packing,我试图使用标准java实用程序将图像覆盖在背景图像之上。请看下面的图片 我有一些代码似乎可以创建背景图像(你能验证它是否真的有效吗?) 我还创建了一个JPanel扩展,用于显示图像(该类称为ImagePanel) 但是,当程序启动时,JFrame只显示第二个图像,然后随着窗口大小的调整而移动 我想有一个窗口打开与背景图像占据了整个窗口的空间最初。然后,我希望在顶部指定的位置显示第二个图像 import javax.swing.*; import java.awt.*; public class
import javax.swing.*;
import java.awt.*;
public class ImageTest {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().setLayout(null);
JPanel backgroundPanel = new JPanel();
ImageIcon backgroundImage = new ImageIcon("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\TableAndChairs.png");
JLabel background = new JLabel(backgroundImage);
background.setBounds(0, 0, backgroundImage.getIconWidth(), backgroundImage.getIconHeight());
frame.getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));
backgroundPanel.setOpaque(false);
frame.setContentPane(backgroundPanel);
ImagePanel button = new ImagePanel("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\button.png");
JPanel cardContainer = new JPanel(new FlowLayout());
frame.getContentPane().add(cardContainer);
cardContainer.add(button);
cardContainer.setBounds(100, 600, 200, 200);
frame.pack();
frame.setVisible(true);
}
}
我想把窗户打开
首先是背景图像
占据了整个窗户的空间
空间
然后简单地创建一个带有图标的JLabel,并将标签用作框架的内容窗格。打包帧时,它将假定为图像的大小
然后我想要第二张图片
显示在顶部,位于
我具体说明
import javax.swing.*;
import java.awt.*;
public class ImageTest {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().setLayout(null);
JPanel backgroundPanel = new JPanel();
ImageIcon backgroundImage = new ImageIcon("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\TableAndChairs.png");
JLabel background = new JLabel(backgroundImage);
background.setBounds(0, 0, backgroundImage.getIconWidth(), backgroundImage.getIconHeight());
frame.getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));
backgroundPanel.setOpaque(false);
frame.setContentPane(backgroundPanel);
ImagePanel button = new ImagePanel("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\button.png");
JPanel cardContainer = new JPanel(new FlowLayout());
frame.getContentPane().add(cardContainer);
cardContainer.add(button);
cardContainer.setBounds(100, 600, 200, 200);
frame.pack();
frame.setVisible(true);
}
}
对上述标签使用空布局。现在,您可以创建带有图标的其他JLabel,并将它们添加到内容窗格中,然后使用setBounds发布它们
我想把窗户打开
首先是背景图像
占据了整个窗户的空间
空间
然后简单地创建一个带有图标的JLabel,并将标签用作框架的内容窗格。打包帧时,它将假定为图像的大小
然后我想要第二张图片
显示在顶部,位于
我具体说明
import javax.swing.*;
import java.awt.*;
public class ImageTest {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().setLayout(null);
JPanel backgroundPanel = new JPanel();
ImageIcon backgroundImage = new ImageIcon("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\TableAndChairs.png");
JLabel background = new JLabel(backgroundImage);
background.setBounds(0, 0, backgroundImage.getIconWidth(), backgroundImage.getIconHeight());
frame.getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));
backgroundPanel.setOpaque(false);
frame.setContentPane(backgroundPanel);
ImagePanel button = new ImagePanel("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\button.png");
JPanel cardContainer = new JPanel(new FlowLayout());
frame.getContentPane().add(cardContainer);
cardContainer.add(button);
cardContainer.setBounds(100, 600, 200, 200);
frame.pack();
frame.setVisible(true);
}
}
对上述标签使用空布局。现在,您可以创建带有图标的附加JLabel,并将其添加到内容窗格中,然后使用setBounds将其发布。您可以将背景面板的首选大小设置为图像的大小:
backgroundPanel.setPreferredSize(new Dimension(
backgroundImage.getIconWidth(), backgroundImage.getIconHeight()));
我主张遵循@camickr的方法。我之前没有尝试过setBounds()
我自己,下面是一个简单的例子来说明效果:
import javax.swing.*;
import java.awt.*;
public class ImageTest {
public static void main(String[] args) {
JFrame frame = new JFrame();
JLabel label = new JLabel(new ElliptIcon(380, 260, Color.red));
label.setLayout(new GridLayout(2, 2));
frame.setContentPane(label);
for (int i = 0; i < 4; i++) {
label.add(new JLabel(new ElliptIcon(100, 60, Color.blue)));
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
private static class ElliptIcon implements Icon {
private int w, h;
private Color color;
public ElliptIcon(int w, int h, Color color) {
this.w = w;
this.h = h;
this.color = color;
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.setColor(color);
g.fillOval(x, y, w, h);
}
@Override
public int getIconWidth() { return w; }
@Override
public int getIconHeight() { return h; }
}
}
import javax.swing.*;
导入java.awt.*;
公共类图像测试{
公共静态void main(字符串[]args){
JFrame=新JFrame();
JLabel标签=新的JLabel(新的椭圆指示器(380260,颜色为红色));
label.setLayout(新的GridLayout(2,2));
frame.setContentPane(标签);
对于(int i=0;i<4;i++){
添加标签(新的JLabel(新的ElliptIcon(100,60,颜色为蓝色));
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
私有静态类ElliptIcon实现图标{
私人int w,h;
私人色彩;
公共椭圆指示器(整数w、整数h、彩色){
这个.w=w;
这个,h=h;
这个颜色=颜色;
}
@凌驾
公共虚空绘制图标(组件c、图形g、整数x、整数y){
g、 设置颜色(颜色);
g、 椭圆形(x,y,w,h);
}
@凌驾
public int getIconWidth(){return w;}
@凌驾
public int getIconHeight(){return h;}
}
}
您可以将背景面板的首选大小设置为图像的大小:
backgroundPanel.setPreferredSize(new Dimension(
backgroundImage.getIconWidth(), backgroundImage.getIconHeight()));
我主张遵循@camickr的方法。我之前没有尝试过setBounds()
我自己,下面是一个简单的例子来说明效果:
import javax.swing.*;
import java.awt.*;
public class ImageTest {
public static void main(String[] args) {
JFrame frame = new JFrame();
JLabel label = new JLabel(new ElliptIcon(380, 260, Color.red));
label.setLayout(new GridLayout(2, 2));
frame.setContentPane(label);
for (int i = 0; i < 4; i++) {
label.add(new JLabel(new ElliptIcon(100, 60, Color.blue)));
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
private static class ElliptIcon implements Icon {
private int w, h;
private Color color;
public ElliptIcon(int w, int h, Color color) {
this.w = w;
this.h = h;
this.color = color;
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.setColor(color);
g.fillOval(x, y, w, h);
}
@Override
public int getIconWidth() { return w; }
@Override
public int getIconHeight() { return h; }
}
}
import javax.swing.*;
导入java.awt.*;
公共类图像测试{
公共静态void main(字符串[]args){
JFrame=新JFrame();
JLabel标签=新的JLabel(新的椭圆指示器(380260,颜色为红色));
label.setLayout(新的GridLayout(2,2));
frame.setContentPane(标签);
对于(int i=0;i<4;i++){
添加标签(新的JLabel(新的ElliptIcon(100,60,颜色为蓝色));
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
私有静态类ElliptIcon实现图标{
私人int w,h;
私人色彩;
公共椭圆指示器(整数w、整数h、彩色){
这个.w=w;
这个,h=h;
这个颜色=颜色;
}
@凌驾
公共虚空绘制图标(组件c、图形g、整数x、整数y){
g、 设置颜色(颜色);
g、 椭圆形(x,y,w,h);
}
@凌驾
public int getIconWidth(){return w;}
@凌驾
public int getIconHeight(){return h;}
}
}
任何使用JLabel而不是JPanelI的原因都只是将保存背景图像的JPanel更改为空布局,从而解决了在我选择的位置覆盖第二幅图像的问题。然而,框架仍然没有大小,你知道我能做什么吗?经过一些修补后,它看起来真的工作了。谢谢你的帮助问题是为什么你想使用JPanel作为背景图像?当JLabel已经编写自定义代码时,为什么还要编写自定义代码?JLabel已经根据图像的大小计算出首选大小。为什么要编写自定义代码来计算面板的大小?(也就是说,为什么你认为框架打开时没有大小?)为什么你不在评论之前先尝试一下这个建议呢?你为什么要用JLabel而不是JPanelI呢?你只是改变了JPanel的背景图像为空布局,这就解决了在我选择的位置覆盖第二幅图像的问题。然而,框架仍然没有大小,你知道我能做什么吗?经过一些修补后,它看起来真的工作了。谢谢你的帮助问题是为什么你想使用JPanel作为背景图像?当JLabel已经编写自定义代码时,为什么还要编写自定义代码?JLabel已经基于的大小计算首选大小