我有一个奇怪的问题:一个使图片全屏的程序,单独执行没有问题,如下:
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;
import javax.swing.*;public class java_test implements KeyListener {
        JFrame frame;        int hight, width;        Graphics g;        Image plaatje;        BufferStrategy bufferStrategy;
        
        
        
        boolean running = true;
        JButton b1;        int x = 0, y = 0;        public java_test() {
         try{
         b1 = new JButton("OK");
    
                frame = new JFrame("MoveNL");
                frame.addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e) {
                                System.exit(0);
                        }
                });
                frame.setUndecorated(true);
                frame.setIgnoreRepaint(true);
                frame.setFocusable(true);
                frame.addKeyListener(this);
                GraphicsEnvironment gEnv = GraphicsEnvironment
                                .getLocalGraphicsEnvironment();
                GraphicsDevice gDev = gEnv.getDefaultScreenDevice();
                DisplayMode dplMode = new DisplayMode(1024, 768, 16,
                                DisplayMode.REFRESH_RATE_UNKNOWN);
                gDev.setFullScreenWindow(frame);
                gDev.setDisplayMode(dplMode);
                frame.setVisible(true);
                frame.createBufferStrategy(2);
                bufferStrategy = frame.getBufferStrategy();
                plaatje = Toolkit.getDefaultToolkit().getImage("Winter.jpg");
                render();
                frame.dispose();
        }catch(Exception exe){
            exe.printStackTrace();
        }        }        private void render() {
                while (running) {
                        try {
                                g = bufferStrategy.getDrawGraphics();
                                g.fillRect(0, 0, 1024, 768);
                                g.drawImage(plaatje, x, y, null);
                        } finally {
                                g.dispose();
                        }
                        bufferStrategy.show();
                }
        }        public void keyTyped(KeyEvent e) {
                switch (e.getKeyChar()) {
                case 'q':
                        running = false;
                        break;
                }
                switch (e.getKeyChar()) {
                case 'z':
                        x++;
                        y++;
                        break;
                }
                return;
        }        public void keyReleased(KeyEvent e) {
        }        public void keyPressed(KeyEvent e) {
        }        public static void main(String[] args) {
                new java_test();
        }
}
现在问题是,如果我要在另一个程序中调用它,比方说:
import java.awt.*;
import java.awt.event.*;import javax.swing.*;public class test  implements ActionListener{
public static void main(String[] args) {
new test();
}

public test(){
JFrame f1;
JButton b1;
f1 = new JFrame("test");
b1 = new JButton("OK"); 
f1.add(b1);
f1.setBounds(50, 50, 300, 300);
f1.setEnabled(true);
f1.setVisible(true);
b1.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
new java_test();
}
}
当点击按钮进入全屏后,这个时候按键事件失效,哪位大侠帮帮我好吗?

解决方案 »

  1.   

    第一个程序可以运行是因为界面显示图片绘制的方法是在主线程中调用的,看一下render方法的实现,这个方法是一个死循环,除非在事件派发线程中有一个相应的键盘事件将标记位running的值设置为false。第二个程序中,将new java_test()放到了Button的响应方法中,也就是说将图片绘制的render方法是在事件派发线程中调用的。此时事件派发线程会因为这个render方法一直在循环中,不能再派发其他的事件,键盘事件将永远在事件队列中,得不到派发,所以程序也就获取不到键盘事件了。将actionPerformed方法修改为下面的方式可行,但是违背的GUI编程的原则:将界面显示的相关操作放到事件派发线程中处理。建议改变一个程序实现。public void actionPerformed(ActionEvent e) {
    new Thread(new Runnable(){
    @Override
    public void run() {
    // TODO Auto-generated method stub

    new java_test();
    }
    }).start();
    }
      

  2.   

    我也想改变程序实现呀,可是我的程序功能是点击按钮实现图片的放大,缩小,全屏的。小弟初次做这个,实在也是无从下手,只有先把功能实现交差的说了。通过LS大侠的讲解,看来我的功底不是一般的浅呀。
    这里对LS大侠表示衷心感谢了。