java - 在 java 中使用 Keylistener 的 CardLayout 问题

标签 java swing jpanel keylistener cardlayout

首先,我有 2 个类 RuntestFront 使用 Jpanel 扩展。我想做的是用按键监听器(ENTER 键)切换这两个面板,但它只是静态的并且不会改变,这是到目前为止的代码,

import static com.sun.java.accessibility.util.AWTEventMonitor.addKeyListener;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;


public class Pactest implements ActionListener , KeyListener{

     JFrame frame = new JFrame("Test");
     Runtest test ;
     Front front = new Front();
     CardLayout cardpane = new CardLayout();
     int key ;


   public Pactest() throws IOException, UnsupportedAudioFileException, LineUnavailableException {


        addKeyListener(this);

         this.test = new Runtest();
         frame.setLayout(cardpane);
         frame.setSize(355, 520);
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.add(front);
         frame.add(test);
         frame.setVisible(true);
         frame.setResizable(false);  

         cardpane.show(front, "1");



   }


@Override
public void actionPerformed(ActionEvent ae) {
    if(key == KeyEvent.VK_ENTER){
     cardpane.next(frame); 

     }
}

@Override
public void keyTyped(KeyEvent ke) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of    generated methods, choose Tools | Templates.
}

@Override
public void keyPressed(KeyEvent ke) {
    key = ke.getKeyCode();

}
@Override
public void keyReleased(KeyEvent ke) {
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
} 


   public static void main(String[] args) throws IOException,              UnsupportedAudioFileException, LineUnavailableException {

    SwingUtilities.invokeLater( new Runnable() {
    @Override
    public void run(){

           new Pactest() ;

      }

  }); 
 }

最佳答案

当您在没有此方法的类中调用 addKeyListener(...) 时,您的代码甚至不应该编译,因为它不是从 Component 或 JComponent 扩展的:

public class Pactest implements ActionListener , KeyListener{

     JFrame frame = new JFrame("Test");
     Runtest test ;
     Front front = new Front();
     CardLayout cardpane = new CardLayout();
     int key ;

   public Pactest() throws IOException, UnsupportedAudioFileException, LineUnavailableException {
        addKeyListener(this);

将来,如果您询问有编译问题的代码,请告诉我们这些问题,发布所有错误消息,并指出哪些行涉及错误。

一旦你解决了这个问题,更好的解决方案是使用键绑定(bind),因为使用键绑定(bind)你可以解决 KeyListener 所遇到的大多数问题。请查看Key Bindings Tutorial了解更多。

<小时/>

更具体的建议:

  • 请注意,如果将 CardLayout 添加到 JFrame,实际上是将其添加到 JFrame 的 contentPane,而不是 JFrame 本身,这可能会让您陷入困境。
  • 而是将 CardLayout 添加到 JPanel,然后将“卡片”(通常是其他 JPanel)添加到同一个 JPanel。
  • 调用 CardLayout 方法时,必须传入使用它的容器,即上述 JPanel。
  • 然后将使用 JPanel 的 CardLayout 添加到您需要的 JFrame 中。
  • 再次强调,使用按键绑定(bind),而不是 KeyListener,因为如果设置正确,按键绑定(bind)即使在绑定(bind)的组件没有焦点的情况下也可以工作。

关于java - 在 java 中使用 Keylistener 的 CardLayout 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25049571/

相关文章:

java - 将关键监听器添加到 JtextArea

java - EJB3 带来了哪些特性以及 EJB3 如何与 Spring 框架相结合?

java - 是否建议使用带有 ResultSet 作为事件源的观察者模式?

java - 指定单独的 JOptionPane 的目标屏幕

java - 根据用户Java Swing绘制多个形状

java - 如何更改另一个类的私有(private)变量 JTextField 或为其赋值?

java - 通过Java代码获取P4的锁

java - Spring为什么单次调用@Cacheable注解方法会执行2次@Cacheable keyGenerator

java - 如何添加一个扩展 JPanel 到 JFrame 的类?

java - 获取光标坐标作为相对于 JPanel 的点