为什么这个类在直接运行时是可见的,但是当从其他类调用时,它是空的并且无法关闭

时间:2013-09-22 10:25:13

标签: java eclipse swing

当我运行这个类(Try类)时,它完全调用Stacker类(带有完整函数),但是当我使用其他类(我使用JFrame和带有调用Stacker类的actionlistener的按钮)来运行它时(Stacker)类),JFrame(Stacker类)会弹出但是空,我无法关闭程序。

我试图从其他类这样运行此(Stacker):

public class Try {

    /**
     * @param args
     */
    public static void main(String[] args) {

        run();

    }

    public static void run(){
        new Stacker();
    }

}

Stacker类完全运行(我可以与它交互)。但是当我尝试从JFrame中的按钮的actionlistener调用堆栈器类时,它是空白的,无法关闭。

请帮帮我。

这是Stacker类的代码:

import java.awt.Color;
import java.awt.Component;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Stacker  extends JFrame implements KeyListener {

    int iteration = 1;
    static double time = 200;
    static int last = 0;
    static int m = 10;
    static int n = 20;
    JButton b[][];
    static int length[] = {5,5};
    static int layer = 19;
    static int deltax[] = {0,0};
    static boolean press = false;
    static boolean forward = true;
    static boolean start = true;
    JPanel panel;

    public static void main (String[] args) {
        Stacker stack = new Stacker();
        stack.setVisible(true);
    }

    public Stacker() {
        panel = new JPanel();
        panel.setLayout(new GridLayout(20,10));

        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        b = new JButton [m][n];

        for (int y = 0;y<n;y++) {
            for (int x = 0;x<m;x++) {
                b[x][y] = new JButton(" ");
                b[x][y].setBackground(Color.white);
                b[x][y].setBorderPainted(false);
                panel.add(b[x][y]);
                b[x][y].setEnabled(true);
            }//end inner for
        }
        setSize(390, 560);
        setLayout(new GridBagLayout());
        add(panel);
        setFocusable(true);
        addKeyListener(this);
        pack();
        setVisible(true);
        go();
    }

    public void go() {
        int tmp = 0;
        Component temporaryLostComponent = null;
        do {
            if (forward == true) {
                forward();
            } else {
                back();
            }
            if (deltax[1] == 10-length[1]){
                forward = false;
            } else if (deltax[1] == 0){
                forward = true;
            }
            draw();
            try {
                Thread.sleep((long) time);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }while(press == false);
        if (layer>12) {
            time= 150-(iteration*iteration*2-iteration); 
        } else {
            time = time - 2.2;
        }
        iteration++;
        layer--;
        press = false;
        tmp = check();
        length[0] = length[1];
        length[1] = tmp;
        if (layer == -1) {
            JOptionPane.showMessageDialog(temporaryLostComponent, "Congratulations! You beat the game!");
        }
        if (length[1] <= 0) {
            JOptionPane.showMessageDialog(temporaryLostComponent, "Game over! You reached line "+(18-layer)+"!");
            System.exit(0);
        }
        last = deltax[1];
        start = false;
        go();
    }

    public int check() {
        if (start == true) {
            return length[1];
        } else if (last<deltax[1]) {
            if (deltax[1]+length[1]-1 <= last+length[0]-1) {
                return length[1];
            } else {
                return length[1]-Math.abs((deltax[1]+length[1])-(last+length[0]));
            }
        } else if (last>deltax[1]) {
            return length[1]-Math.abs(deltax[1]-last);
        } else {
            return length[1];
        }
    }

    public void forward() {
        deltax[0] = deltax[1];
        deltax[1]++;
    }

    public void back() {
        deltax[0] = deltax[1];
        deltax[1]--;
    }

    public void draw() {
        for (int x = 0;x<length[1];x++) {
            b[x+deltax[0]][layer].setBackground(Color.white);
        }
        for (int x = 0;x<length[1];x++) {
            b[x+deltax[1]][layer].setBackground(Color.BLUE);
        }
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_SPACE) {
            press = true;
        }
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub
    }
}

3 个答案:

答案 0 :(得分:2)

你的do-while循环和线程睡眠看起来很可疑,因为它正在Swing事件线程上运行它。问题是这些运行时间较长的任务会锁定Swing E 发泄 D ispatch T hread或EDT,这是一个负责所有人的线程Swing图形和用户交互,阻止您的应用程序绘制自身及其所有小部件,并阻止应用程序响应任何用户输入。

可能这个应用程序是孤立运行的,因为我上面提到的问题都是在EDT之上运行的,而且这个代码可以解决你的问题,但是我认为有更好的解决方案我们可以提供帮助如果您告诉我们更多关于您问题的详细信息,请与您联系。

此外,您似乎正在使用go方法调用本身以危险的方式使用递归。因为我在手机上,所以真的不能多说。

答案 1 :(得分:1)

首先,我会替换:this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 以下内容:

this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

因为DISPOSE_ON_CLOSE是一个静态/类变量。

事实上,我很惊讶您的IDE没有选择它(除非您没有使用IDE)。

答案 2 :(得分:-1)

SwingWorker worker = new SwingWorker<Void, Void>() {

     @Override
       protected Void doInBackground() throws Exception {
               Stacker stack = new Stacker();
               stack.setVisible(true);
              return null;
           }
    };
    worker.execute();

使用此方法后,当我从另一个JFrame调用Stacker class时,游戏执行完美。就像从Stacker class调用Try class一样。

感谢您的所有回复。 :d