Java 如何将两个扩展的JPanel类加载到一个JFrame?

Java 如何将两个扩展的JPanel类加载到一个JFrame?,java,image,swing,jpanel,paint,Java,Image,Swing,Jpanel,Paint,我要用Java做一个游戏,我的游戏会有一个菜单。该菜单具有背景和2个JLabel对象。我将它们放在单独的类上,然后传递给一个JFrame。我的问题是,我在一个帧上加载了两个,但其中一个总是被另一个隐藏 代码如下: JFrame类 背景类 菜单类 我想要的是菜单在背景的前面,但背景仍然可以看到。以及如何将我创建的JLabel排列到屏幕的中心位置 如何实现所需的布局?首先使用JFrame#add而不是JFrame#setContentPane,除非您打算向该(内容)窗格添加更多组件 默认情况下,JF

我要用Java做一个游戏,我的游戏会有一个菜单。该菜单具有背景和2个
JLabel
对象。我将它们放在单独的类上,然后传递给一个
JFrame
。我的问题是,我在一个帧上加载了两个,但其中一个总是被另一个隐藏

代码如下:

JFrame类 背景类 菜单类 我想要的是菜单在背景的前面,但背景仍然可以看到。以及如何将我创建的
JLabel
排列到屏幕的中心位置


如何实现所需的布局?

首先使用
JFrame#add
而不是
JFrame#setContentPane
,除非您打算向该(内容)窗格添加更多组件

默认情况下,
JFrame
为其
LayoutManager
使用
BorderLayout
。您需要将其更改为您喜欢使用的内容,或者将每个组件添加到
边框布局中的适当位置

有关更多详细信息,请参阅

public class Ngrep extends JPanel{
请注意,由于
Ngrep
是一个
JPanel
,因此可以直接向其添加组件,从而使
菜单
类成为冗余类

类似于在这张照片上看到的东西

请注意,我最终做出了如此多的更改,速度如此之快,以至于我无法明确记录其中的大多数更改。仔细检查代码,对照您的原始代码进行检查,检查Java文档,如果有任何您不理解的更改,请询问我

import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.URL;
import javax.imageio.ImageIO;

@SuppressWarnings("serial")
public class Sistem extends JFrame {

    public Sistem() {
        this.setTitle("Unknown man Unkown power");
        this.setFocusable(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setContentPane(new Ngrep());
        this.setResizable(false);
        this.pack();

        this.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Sistem();
            }
        });
    }
}

@SuppressWarnings("serial")
class Ngrep extends JPanel {

    private int l = 375;
    private int t = 150;
    private BufferedImage bg;
    JLabel menu1 = new JLabel("MULAI BARU");
    JLabel menu2 = new JLabel("KELUARRR");

    public Ngrep() {
        this.add(menu1);
        this.add(menu2);

        try {
            Font f = new Font(Font.MONOSPACED, Font.ITALIC, 30);
            menu1.setFont(f);
            menu1.setForeground(Color.RED);
            menu2.setFont(f);
            menu2.setForeground(Color.RED);
            URL url = new URL("http://i.stack.imgur.com/OVOg3.jpg");
            bg = ImageIO.read(url);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        setLayout(new GridLayout(2, 3));

        add(menu1);
        add(menu2);
    }

    public Dimension getPreferredSize() {
        return new Dimension(l, t);
    }

    /*
     * For a JComponent, override paintComponent rather than paint
     */
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // a JPanel IS AN ImageObserver
        g.drawImage(bg, 0, 0, getWidth(), getHeight(), this);
    }
}

解决了,因为我发现我使用了paint()而不是paintComponent()。 像这样:

@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
g.drawImage(bg, 0, 0, l, t, this);
}
为此:

@Override
public void paintComponent(Graphics g) {
// TODO Auto-generated method stub
super.paintComponents(g);

g.drawImage(bg, 0, 0, l, t, this);
}

正如我所说,默认的布局管理器
JFrame
是一个
BorderLayout
。如果在指定位置的情况下添加这两个零部件,它们将被添加到
中心
位置,但仅显示最后一个零部件。查看链接了解更多详细信息…我已经尝试过了,但它仍然只显示BuffereImage。是图像不能重叠吗?我只是发现我的错,我用了“paint()”而不是“paintComponent()”。谢谢你,很高兴你把它整理好了。:)
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.URL;
import javax.imageio.ImageIO;

@SuppressWarnings("serial")
public class Sistem extends JFrame {

    public Sistem() {
        this.setTitle("Unknown man Unkown power");
        this.setFocusable(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setContentPane(new Ngrep());
        this.setResizable(false);
        this.pack();

        this.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Sistem();
            }
        });
    }
}

@SuppressWarnings("serial")
class Ngrep extends JPanel {

    private int l = 375;
    private int t = 150;
    private BufferedImage bg;
    JLabel menu1 = new JLabel("MULAI BARU");
    JLabel menu2 = new JLabel("KELUARRR");

    public Ngrep() {
        this.add(menu1);
        this.add(menu2);

        try {
            Font f = new Font(Font.MONOSPACED, Font.ITALIC, 30);
            menu1.setFont(f);
            menu1.setForeground(Color.RED);
            menu2.setFont(f);
            menu2.setForeground(Color.RED);
            URL url = new URL("http://i.stack.imgur.com/OVOg3.jpg");
            bg = ImageIO.read(url);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        setLayout(new GridLayout(2, 3));

        add(menu1);
        add(menu2);
    }

    public Dimension getPreferredSize() {
        return new Dimension(l, t);
    }

    /*
     * For a JComponent, override paintComponent rather than paint
     */
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // a JPanel IS AN ImageObserver
        g.drawImage(bg, 0, 0, getWidth(), getHeight(), this);
    }
}
@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
g.drawImage(bg, 0, 0, l, t, this);
}
@Override
public void paintComponent(Graphics g) {
// TODO Auto-generated method stub
super.paintComponents(g);

g.drawImage(bg, 0, 0, l, t, this);
}