gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:21:00 25 4
gpt4 key购买 nike

我打算用 Java 制作一个游戏,我的游戏会有一个菜单。菜单有背景和 2 个 JLabel 对象。我将它们放在单独的类中,传递给一个 JFrame。我的问题是,我在一个框架上加载了其中的 2 个,但其中一个总是被另一个隐藏。

这是代码:

JFrame 类

@SuppressWarnings("serial")
public class Sistem extends JFrame{
private final int lebar=954;
private final int tinggi=540;
private Image bg;
File gbr=new File("res/a.jpg");

public Sistem(){
this.setTitle("Unknown man Unkown power");
this.setSize(new Dimension(lebar,tinggi));
this.setFocusable(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setContentPane(new Ngrep());
//this.setContentPane(new Menu());


this.setVisible(true);
//loadfont();
//loadbg();

}

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

@Override
public void run() {
// TODO Auto-generated method stub
new Sistem();
}
});
}

}

背景类

@SuppressWarnings("serial")
public class Ngrep extends JPanel{
private int l=954;
private int t=540;
private BufferedImage bg;
File gbr=new File("res/a.jpg");

public Ngrep(){
loadbg();

}

private void loadbg() {
// TODO Auto-generated method stub
try {
bg=ImageIO.read(gbr);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

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

}

菜单类

@SuppressWarnings("serial")
public class Menu extends JPanel implements Runnable,KeyListener{
private int l=954;
private int t=540;
JLabel menu1=new JLabel("MULAI BARU");
JLabel menu2=new JLabel("KELUARRR");
private File fo=new File("res/Mawns.ttf");
JLayeredPane p=new JLayeredPane();

public Menu(){
loadfont();

this.add(menu1);
this.add(menu2);
}


public void loadfont(){
try {
FileInputStream fi=new FileInputStream(fo);
Font f=Font.createFont(Font.TRUETYPE_FONT, fi).deriveFont(Font.TRUETYPE_FONT, 30);
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();

ge.registerFont(f);

menu1.setFont(f);
menu2.setFont(f);

} catch (Exception ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
p.setLayout(new GridLayout(2, 3));

menu1.setBounds(0, 0, getWidth(), getHeight());
menu2.setBounds(0, 0+menu1.getHeight(), getWidth(), getHeight());

p.add(menu1, 2);
p.add(menu2, 2);
}


}

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

如何实现所需的布局?

最佳答案

public class Ngrep extends JPanel{

请注意,由于 Ngrep 是一个 JPanel,您可以直接向其添加组件,从而生成 Menu 类多余的。

类似于在本次 SSCCE 中看到的内容。

Sistem preview

请注意,我最终做出如此多的更改是如此之快,以至于我懒得明确记录其中的大部分。仔细查看代码,与您的原始代码核对,检查 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);
}
}

关于java - 如何将两个扩展的JPanel 类加载到一个JFrame 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20986833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com