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