【问题标题】:Issues with CardLayout using Keylistener in java在 java 中使用 Keylistener 的 CardLayout 问题
【发布时间】:2014-07-31 01:28:41
【问题描述】:

首先,我有 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() ;

      }

  }); 
 }

【问题讨论】:

    标签: java swing jpanel keylistener cardlayout


    【解决方案1】:

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

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

    一旦你解决了这个问题,一个更好的解决方案是使用键绑定,因为使用键绑定你可以解决 KeyListener 在焦点上的大部分问题。请查看Key Bindings Tutorial 了解更多信息。


    更具体的建议:

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

    【讨论】:

    • 似乎还有人期待actionPerformed会被神奇地调用……
    • @MadProgrammer:代码也有很多错误。他对 CardLayout 的使用完全不平衡。他将它添加到 JFrame 的 contentPane 中,但在调用 CardLayout 方法时传入了一些完全不同的 JPanel。
    • 这里没有参数,因为建议添加“如何使用 CardLayout”的链接,但你敢打赌...
    【解决方案2】:

    HovercraftFullOfEels 是正确的 +1,你不应该使用 KeyListener 来完成这个任务,有很多与当前焦点有关的问题......

    您也没有正确使用CardLayout,应仔细查看How to Use CardLayout 了解更多详情。

    我对您的想法的总体问题是,这对用户来说并不明显......除非他们“知道”他们必须按 Enter,否则他们将如何知道如何移动到下一个视图。即使这样,如果一个组件(如文本组件或按钮)正在使用 Enter 来满足自己的需求,这可能会阻止您的关键侦听器/绑定得到通知,最糟糕的是,使用在他们准备好之前转到下一个视图...

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

    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了解更多详情

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-29
      • 2011-10-17
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      相关资源
      最近更新 更多