【发布时间】:2016-06-01 18:05:21
【问题描述】:
所以,首先我知道绝对定位对于 GUI 来说并不理想……但是,我必须构建 4 种不同类型的窗口和 1 个整体游戏窗口,所有这些都带有一个内置的运行器。我有一天半的时间来做这件事,而且在学生的日程安排上(尤其是一个没有编写 GUI 经验并且禁止使用 JOptionPane 的学生),我做得又快又乱。有了这个,问题就来了。
运行 GUI 时,一切都按计划进行。然而,在游戏运行大约 1/4 次时,随机图像会被颠倒过来。它并不总是相同的图像,也不会每次都出现。我让图像出现,但直接在 JFrame 上绘画(没有面板,是的,我知道它的编程很糟糕)。感谢您提供的任何输入,在网上真的找不到这样的东西。我发现的最佳建议是当同一张图像总是上下颠倒时,但事实并非如此。 代码:
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
public class game extends JFrame implements Runnable {
private boolean running = false;
private Image dbImage = null;
private Dimension screenSize;
private int width;
private int height;
private int screenIndex = 0;
private BufferedImage img = null;
private dialog d = new dialog();
private boolean a = false;
private Room1 room1 = new Room1();
private Room2 room2 = new Room2();
private Room3 room3 = new Room3();
private Room4 room4 = new Room4();
private Room5 room5 = new Room5();
private Room6 room6 = new Room6();
private Toilet toilet = new Toilet();
private final boolean UNLOCK = true;
public game()
{
super("Game");
setExtendedState(JFrame.MAXIMIZED_BOTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
setIconImage(new ImageIcon("pencil-icon.png").getImage());
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
width = (int)screenSize.getWidth();
height = (int)screenSize.getHeight();
(new Thread(this)).start();
}
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
switch (screenIndex) {
case 0:
img = null;
try {
img = ImageIO.read(new File("map.png"));
} catch (IOException e) {
}
break;
case 1:
img = null;
try {
img = ImageIO.read(new File("IMG_6009.JPG"));
} catch (IOException e) {
}
break;
case 2:
img = null;
try{
img = ImageIO.read(new File("IMG_6010.JPG"));
}
catch (IOException e) {}
break;
case 3:
img = null;
try {
img = ImageIO.read(new File("IMG_6011.jpg"));
} catch (IOException e) {
}
break;
case 4:
img = null;
try {
img = ImageIO.read(new File("IMG_6013.jpg"));
} catch (IOException e) {
}
break;
case 5:
img = null;
try {
img = ImageIO.read(new File("IMG_5994.jpg"));
} catch (IOException e) {
}
break;
case 6:
img = null;
try {
img = ImageIO.read(new File("IMG_5992.jpg"));
} catch (IOException e) {
}
break;
case 7:
img = null;
try {
img = ImageIO.read(new File("IMG_5991.jpg"));
} catch (IOException e) {
}
break;
}
g.drawImage(img, 0, 0, width, height, null);
}
public static void main(String[] args) {
new game();
}
public void run() {
running = true;
while(running) {
repaint();
process();
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public int isScreenIndex() {
return screenIndex;
}
//SI 1 and 2 are working
public void setScreenIndex(int s) {
this.screenIndex = s;
}
public void process() {
if (screenIndex==0)
{
try{
Thread.sleep(2000);
}
catch (Exception e){}
int a = -1;
a = d.map();
while (a==-1){
try {
Thread.sleep(200);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
if (a==1 && ((room5.isDone() && !room1.isDone()) || UNLOCK)){
setScreenIndex(1);
return;
}
if (a==2 && (!room2.isDone() || UNLOCK)){
setScreenIndex(2);
return;
}
if (a==3 && (!room3.isDone() || UNLOCK)){
setScreenIndex(3);
return;
}
if (a == 4 && ((!room4.isDone() && room3.isDone())||UNLOCK)){
setScreenIndex(4);
return;
}
if (a == 5 && ((room4.isDone() && room6.isDone() && !room5.isDone())||UNLOCK)){
setScreenIndex(5);
return;
}
if (a == 6 && ((room2.isDone() && !room6.isDone())||UNLOCK)){
setScreenIndex(6);
return;
}
if (a == 7){
d.showString("Progress",room1.getRoomName() + "\t\t" + room1.getScore() + "\n" +
room2.getRoomName() + "\t\t" + room2.getScore() + "\n" +
room3.getRoomName() + "\t\t" + room3.getScore() + "\n" +
room4.getRoomName() + "\t\t" + room4.getScore() + "\n" +
room5.getRoomName() + "\t\t" + room5.getScore() + "\n" +
room6.getRoomName() + "\t\t" + room6.getScore());
}
if (a == 8 && (!toilet.isDone() || UNLOCK)){
setScreenIndex(7);
return;
}
}
if (screenIndex == 1){
room1.play();
setScreenIndex(0);
return;
}
if (screenIndex == 2){
room2.play();
setScreenIndex(0);
return;
}
if (screenIndex==3){
//boolean a = false;
room3.play();
//while(!a){
// try {
// Thread.sleep(200);
// } catch(InterruptedException e) {
// }
//}
setScreenIndex(0);
return;
}
if (screenIndex==4){
room4.play();
setScreenIndex(0);
return;
}
if (screenIndex == 5){
room5.play();
setScreenIndex(0);
return;
}
if (screenIndex == 6){
room6.play();
setScreenIndex(0);
return;
}
if (screenIndex == 7){
toilet.play();
setScreenIndex(0);
return;
}
}
}
【问题讨论】:
-
"I don't think it will be useful to post my code..."-- 认真的吗?我们应该猜猜为什么你的程序会出现奇怪的行为不端?请查收minimal reproducible example。 -
而且你有很多公认的糟糕编程正在进行。为什么不修复它,因为你知道它很糟糕?是的,您不应该直接在 JFrame 上绘图,所以不要这样做。
-
好吧,我找到了一个失去声誉的好方法......我之所以这么说的主要原因是因为我正在调用几个文件,大约 9 个其他类,以及它的 200 行。我会立即发布。我知道我的编程很糟糕,但是除了这个错误之外,该项目正在运行,并且班上还有 14 名其他学生正在处理此代码。在这一点上,它的任何更改都只能是很小的,例如错误修复。
-
发帖前,请再次阅读minimal reproducible example链接。您已经过早地发布了您的问题 - 在尝试隔离问题之前,而且在尝试重新编写代码之前,它也不会使用不良做法。如果您只使用良好的做法,那么这个错误很有可能会消失。
-
添加了代码。抱歉,我知道这些要求,但由于上述原因,我真的认为这不会有帮助。
标签: java image swing user-interface position