在Java中使用Keylistener的CardLayout问题

时间:2014-07-31 01:28:41

标签: java swing jpanel keylistener cardlayout

首先,我使用Jpanel扩展了2个类 Runtest Front 。我试图做的是用keylistener(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() ;

      }

  }); 
 }

2 个答案:

答案 0 :(得分:3)

您的代码不应该编译,因为您在没有此方法的类中调用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);

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

一旦解决了这个问题,更好的解决方案就是使用Key Bindings,因为使用Key Bindings可以解决KeyListeners关注的大多数问题。请查看Key Bindings Tutorial了解更多信息。


更具体的建议:

  • 请注意,如果您将CardLayout添加到JFrame,您实际上是将它添加到JFrame的contentPane,而不是JFrame本身,这可能会让您陷入困境。
  • 而是将CardLayout添加到JPanel,然后添加" cards" (通常是其他JPanels)到同一个JPanel。
  • 调用CardLayout方法时,必须传入使用它的容器,即上面描述的相同JPanel。
  • 然后将CardLayout-using JPanel添加到您想要的JFrame中。
  • 再次使用Key Bindings,而不是KeyListener,因为如果设置正确,Key Bindings即使绑定的组件没有焦点也可以工作。

答案 1 :(得分:1)

HovercraftFullOfEels是正确的+1,您不应该使用KeyListener执行此任务,只有很多与当前焦点相关的问题......

您还没有正确使用CardLayout,请仔细查看How to Use CardLayout了解详情。

我对你的想法的总体问题是对用户来说并不明显......除非他们“知道”他们必须按 Enter ,他们将如何知道如何移动到下一个观点。即使这样,如果组件(如文本组件或按钮)正在使用 Enter 来满足它自己的需要,这可能会阻止您的密钥监听器/绑定被充分通知,更糟糕的是,使用它在他们准备好之前到下一个观点......

另一种选择可能是提供一个“下一步”按钮,该按钮被设置为“默认”按钮,它提供相同的功能,但也提供了用户可以理解他们正在做什么的方法...... / p>

No Hands

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Pactest {

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

    private JButton next;
    private JPanel cards;

    public Pactest() throws IOException, UnsupportedAudioFileException, LineUnavailableException {

        cards = new JPanel(cardpane);
        cards.add(front, "1");
        cards.add(test, "2");

        frame.add(cards);
        frame.setSize(355, 520);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setResizable(false);

        cardpane.show(cards, "1");

        next = new JButton("Next");
        frame.add(next, BorderLayout.SOUTH);
        next.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                cardpane.next(cards);
            }
        });

        frame.getRootPane().setDefaultButton(next);

    }

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

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

                try {
                    new Pactest();
                } catch (IOException | UnsupportedAudioFileException | LineUnavailableException ex) {
                    Logger.getLogger(Pactest.class.getName()).log(Level.SEVERE, null, ex);
                }

            }

        });

    }
}

请查看How to Use Root Panes了解详情

相关问题