Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 画布的侦听器问题_Java_Swing_Listener - Fatal编程技术网

Java 画布的侦听器问题

Java 画布的侦听器问题,java,swing,listener,Java,Swing,Listener,我想用Java做一个多人空中曲棍球游戏。我已经让服务器/客户端套接字正常工作了 我的框架有两个面板、画布和jtable的cardLayout。 我想进行lan扫描以查找服务器,然后选择所需的服务器。 我做了这个扫描,并把它放在cardLayout的JTable中。 当我启动服务器时,它直接显示画布卡,侦听器没有问题。 但当我启动客户端时,它会检查lan,然后显示jtable卡。一旦选择了服务器,我就会显示画布并连接到服务器。问题是,没有侦听器工作,我的windowListener和keyList

我想用Java做一个多人空中曲棍球游戏。我已经让服务器/客户端套接字正常工作了
我的框架有两个面板、画布和jtable的cardLayout。
我想进行lan扫描以查找服务器,然后选择所需的服务器。
我做了这个扫描,并把它放在cardLayout的JTable中。
当我启动服务器时,它直接显示画布卡,侦听器没有问题。
但当我启动客户端时,它会检查lan,然后显示jtable卡。一旦选择了服务器,我就会显示画布并连接到服务器。问题是,没有侦听器工作,我的windowListener和keyListener都不工作。

我尝试了很多事情,但没有成功

编辑: 我刚刚就这个问题发了一封短信:

public class test extends Canvas{
public static final int SERVEUR = 10, CLIENT = 20;
public static int STATUT;
JFrame frame;
CardLayout cardsC = new CardLayout();
Container container;
JPanel servPanel = null;
public BufferStrategy strategy;

public test() {
    Object[] options = {"SERVER", "CLIENT"};
    int answer = JOptionPane.showOptionDialog(null, "Choisissez une option:", "Warning", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
    if(answer == 0){
        STATUT = SERVEUR;
        newFrame();
        frame.setVisible(true);
        gameLoop();
    }else if(answer == 1){
        STATUT = CLIENT;
        newFrame(); 
        frame.setVisible(true); 
        cardsC.show(container, "servs");
    }
}

public void connection(){
    if(servPanel != null) servPanel.removeAll();
    cardsC.show(container, "canvas");
    gameLoop();
}

private void gameLoop() {
    while(true){
        try {Thread.sleep(10);}catch (InterruptedException e){e.printStackTrace();}
    }

}

public void newFrame(){
    frame = new JFrame("Space Invaders 101");
    frame.setPreferredSize(new Dimension(600,750));

    container = frame.getContentPane();
    container.setLayout(cardsC);

    setBounds(0, 0, 600, 750);
    container.add(this, "canvas");

    setIgnoreRepaint(true);

    frame.pack();
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);

    if(STATUT == CLIENT){
        servPanel = new JPanel();
        JButton button = new JButton("Valider");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                connection();

            }
        });
        servPanel.add(button);
        container.add(servPanel, "servs");
    }

    KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
    manager.addKeyEventDispatcher(new MyDispatcher());

    requestFocusInWindow();
    requestFocus();

    createBufferStrategy(2);
    strategy = getBufferStrategy();
    cardsC.show(container, "servs");
    cardsC.show(container, "canvas");
}

private class MyDispatcher implements KeyEventDispatcher {
    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getID() == KeyEvent.KEY_TYPED){
            System.out.println(e.getKeyChar());
        }
        return false;
    }
}

public static void main(String argv[]) {
    new test();
}
}

所以,您可以尝试一下,当您选择服务器时,keyListener正在工作,而当您选择客户端时,keyListener则不工作。 我发现如果我不进入gameLoop,keylistener就会工作。 另外,当显示另一张卡(不是画布卡)时,keyListener也可以工作

我想知道如果我先显示jtable卡,如何让听众工作

如果你需要更多的信息


提前感谢,

当您使用CardLayout交换面板时,新卡无法接收焦点,因此KeyListener无法工作。有关更多信息和解决方案,请参阅

但是,更好的解决方案是不使用KeyListener。相反,您应该使用来监听调用游戏中动作的特定键


此外,Swing在默认情况下是双缓冲的。无需将画布与缓冲策略一起使用。

要更快获得更好的帮助,请发布一个。顺便问一下,你有问题吗?这是什么?这都很好。此外,
Canvas
是一个重量级AWT组件。虽然它应该能够很好地与轻量级Swing小部件配合使用,但我的经验是,您总是在与怪癖作斗争。画布用于执行比基于JComponent的图形更好的操作。这一优势似乎在Java7中基本消失了。我尝试了键盲法,但仍然遇到同样的问题。RXCardLayout也是如此。ThanksI写道:KeyStroke upStroke=KeyStroke.getKeyStroke(KeyEvent.VK_UP,0,false);Action upAction=new AbstractAction(){public void actionPerformed(ActionEvent e){System.out.println(“up”);};frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(加大行程,“向上”);frame.getRootPane().getActionMap().put(“UP”,upAction);好吗?是的,我知道,但我不能回答贝弗尔的问题。这就是: