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