请耐心等待我..我对Java很新。
我有两个单独的JFrame,第一个加载我想要的背景但是当我处理第一个JFrame并加载第二个JFrame时,它会加载第一个JFrame。
j1.java
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.ImageIcon;
public class j1 extends JFrame implements KeyListener {
public bg1 img;
public bg2 img2;
public j1() {
lvl1();
}
private JFrame lvl1() {
this.img=new bg1();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
setTitle("lvl1");
setResizable(false);
setSize(600, 600);
setMinimumSize(new Dimension(600, 600));
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().add(img);
pack();
setVisible(true);
return(this);
}
private JFrame lvl2() {
this.img2=new bg2();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
setTitle("lvl2");
setResizable(false);
setSize(600, 600);
setMinimumSize(new Dimension(600, 600));
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().add(img2);
pack();
setVisible(true);
return(this);
}
public void keyPressed(KeyEvent e) { }
public void keyReleased(KeyEvent e) {
if(e.getKeyCode()== KeyEvent.VK_RIGHT) {
lvl1().dispose();
lvl2();
}
}
public void keyTyped(KeyEvent e) { }
public static void main(String[] args) {
new j1();
}
}
bg1.java
import java.awt.Graphics;
import javax.swing.JComponent;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
public class bg1 extends JComponent {
public BufferedImage person;
public BufferedImage background;
public bg1() {
loadImages2();
}
public void loadImages2() {
try {
String personn = "Images/person.gif";
person = ImageIO.read(new File(personn));
String backgroundd = "Images/background2.jpg";
background = ImageIO.read(new File(backgroundd));
} catch (IOException ex) {
ex.printStackTrace();
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(background, 0, 0, this);
g.drawImage(person, 100, 100, this);
}
public static void main(String[] args) {
new bg1();
}
}
bg2.java与bg1.java非常相似,但它有不同的图像和空白名称。
答案 0 :(得分:2)
所以你有一系列问题。
首先,这是以这种方式重新使用框架的危险之一,基本上,您实际上从未从框架中删除bg1
,只是不断添加bg2
的新实例。这意味着bg1
在框架上仍然可见且有效...
其次,您在致电lvl1()
之前再次致电lvl2
,这是bg1
的新实例并将其添加到窗口然后处理它(哪个不处理组件)然后你在框架中添加一个lvl2
的新实例,整个事情只是一个大问题。
相反,您应该只使用CardLayout
,这样您就可以更优雅地在各个视图之间切换。有关详细信息,请参阅How to Use CardLayout。
您还应该查看How to Use Key Bindings,而不是使用KeyListener
作为一般的经验法则,你应该避免重写JFrame
,这有一个令人讨厌的习惯,就是混淆整个事情。在需要时简单地创建JFrame
的新实例,并将组件直接添加到其中。在任何人采取错误的方式之前,您还要查看The Use of Multiple JFrames, Good/Bad Practice?