Java 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

我试图使用标准java实用程序将图像覆盖在背景图像之上。请看下面的图片

我有一些代码似乎可以创建背景图像(你能验证它是否真的有效吗?) 我还创建了一个JPanel扩展,用于显示图像(该类称为ImagePanel)

但是,当程序启动时,JFrame只显示第二个图像,然后随着窗口大小的调整而移动

我想有一个窗口打开与背景图像占据了整个窗口的空间最初。然后,我希望在顶部指定的位置显示第二个图像

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已经基于的大小计算首选大小