繁体   English   中英

为什么键侦听器不会像代码中的其他侦听器那样成功地响应CardLayout的面板?

Why doesnt the keylistener react CardLayout's panel as other listeners in the code do successfully?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我编写了一个侦听器,该侦听器将从屏幕保护程序JPanel切换回主屏幕,并将其添加到屏幕保护程序JPanel创建方法中,但是它不会在按键时触发并且什么也没有发生。

有人知道发生了什么吗?

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import static javax.swing.SwingUtilities.invokeLater;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class layoutdemo {
    JPanel cards; // panel that uses CardLayout
    CardLayout clo;
    final static String WELCOMEPANEL = "Card with welcome message";
    final static String SCREENSAVERPANEL = "Card with screensaver";
    final static String ENTERPINPANEL = "Card with PIN input"; // not implemented yet
    final static String[] FILEARRAY = new String[]      {"/cardlayouttest/newpackage/btc-zg.jpg","/cardlayouttest/newpackage/pic2.jpeg"};
    static layoutdemo ldm = null;
    private static int INDEX = 0;
    private JLabel screenImage;
    private Timer changeTimer;
    public void addComponenttoPane(Container pane){ //method for adding CardLayout and components to JFrame
    cards = new JPanel(new CardLayout());
    cards.add(welcomePanel(),WELCOMEPANEL);
    cards.add(screensaverPanel(),SCREENSAVERPANEL);
    pane.add(cards,BorderLayout.CENTER);
}
public JPanel welcomePanel(){ //method for creating the "Welcome" panel
    JPanel welcomePanel;
    welcomePanel = new JPanel();
    JLabel welcomeLabel = new JLabel("Dobrodošli na depozitni bankomat!",SwingConstants.CENTER);
    JLabel instructionLabel = new JLabel("Molim vas ubacite karticu u utor sa desne strane",SwingConstants.CENTER);
    instructionLabel.setFont(new Font(instructionLabel.getFont().getFontName(),Font.PLAIN,28));
    welcomeLabel.setFont(new Font(instructionLabel.getFont().getFontName(),Font.PLAIN,28));
    welcomePanel.setLayout(new GridLayout(0,1));
    welcomePanel.add(welcomeLabel);
    welcomePanel.add(instructionLabel);

    return welcomePanel;
}
public JPanel screensaverPanel(){ // method for creating the "Screensaver" panel
    JPanel screensaverPanel;
    screensaverPanel = new JPanel();
    screenImage = new JLabel();
    screenImage.setIcon(new ImageIcon(getClass().getResource("/cardlayouttest/newpackage/btc-zg.jpg")));
    screensaverPanel.add(screenImage);
    screensaverPanel.addKeyListener(stopScreensaver());
    screensaverPanel.setFocusable(true);
    return screensaverPanel;
}
private static layoutdemo createAndShowGUI(){ // method for creating and showing the GUI
    JFrame frame1 = new JFrame("layoutdemowithswitch");
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    layoutdemo ldm = new layoutdemo();
    ldm.addComponenttoPane(frame1);
    frame1.pack();
    frame1.setVisible(true);
    frame1.getGraphicsConfiguration().getDevice().setFullScreenWindow(frame1);
    ldm.clo = (CardLayout) ldm.cards.getLayout();
    ldm.clo.show(ldm.cards, WELCOMEPANEL);
    return ldm;
}
public ActionListener timeoutPanelListener(Timer timer){ //listener for main screen timeout - returns to ads
    ActionListener timeout = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            CardLayout cl = (CardLayout) cards.getLayout();
            cl.show(cards, SCREENSAVERPANEL);
            timer.stop();
            changeTimer = new Timer(5000,changeImageListener(screenImage));
            changeTimer.start();

        }
    };
    return timeout;
}
    public ActionListener changeImageListener(JLabel image){ //listener for changing images in Screensaver
    ActionListener change = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            image.setIcon(new ImageIcon(getClass().getResource(FILEARRAY[INDEX])));
            INDEX++;
            if (INDEX >= FILEARRAY.length) INDEX = 0;

        }
    };
    return change;
}
public KeyListener stopScreensaver(){
    KeyListener key = new KeyListener() {

        @Override
        public void keyTyped(KeyEvent e) {
            CardLayout cl = (CardLayout) cards.getLayout();
            cl.show(cards, WELCOMEPANEL);
            Timer timer2 = new Timer(10000,null);
            ActionListener timeout = ldm.timeoutPanelListener(timer2);
            timer2.addActionListener(timeout);
            timer2.start();
            System.out.println("key typed");
        }

        @Override
        public void keyPressed(KeyEvent e) {

        }

        @Override
        public void keyReleased(KeyEvent e) {
            CardLayout cl = (CardLayout) cards.getLayout();
            cl.show(cards, WELCOMEPANEL);
            Timer timer2 = new Timer(10000,null);
            timer2.start();
            ActionListener timeout = ldm.timeoutPanelListener(timer2);
        }
    };
    return key;
    }

   public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, UnsupportedLookAndFeelException{
   UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
   invokeLater(new Runnable(){
       @Override
       public void run(){
           ldm = createAndShowGUI();      
           Timer timer = new Timer(5000,null);
           ActionListener timeout = ldm.timeoutPanelListener(timer);
           timer.addActionListener(timeout);
           timer.start();       
       }
   });
   }
}
1 个回复

使用CardLayout时,在切换卡时不会将焦点放在面板上。 由于面板没有焦点,因此无法接收KeyEvent。

因此,首先您需要使面板聚焦。

其次,您需要在面板可见时为其赋予焦点。 查看卡片布局重点 这是扩展CardLayout的类,并在面板可见时为面板提供焦点。

1 将Keylistener添加到CardLayout的面板中

我正在写一个简单的游戏,我的主框架有4个JPanels放置在CardLayout中。 主框架如下所示: GameScene面板对键盘输入有反应。 首先,我尝试了keylistener: 那没有用...所以我尝试了键绑定(简单的实现): 它仍然无法正常工作。我尝试添加r ...

2 控制器的侦听器从其他视图捕获事件(面板单击)

我在ExtJS 4.2.1中遇到这个奇怪的问题。 我有一个控制器,其侦听器从不应接收的事件捕获事件。 这就是控制器: 它“控制”此视图: 但它也可以从此视图中捕获面板点击: 您看到它这样做的任何明显原因吗? panel的确是我正在单击的面板,而不是文档正文, ...

3 KeyListener可能正在调用其他Key的代码(JDBC)

我有一个系统,您可以按空间来暂停模拟,然后箭头移动摄像机等。然后,如果按e ,则会弹出一个JFrame,其中包含一个JTable,其中包含来自已连接数据库的SQL搜索的结果。 一切正常,我可以像往常一样关闭JFrame并继续运行仿真,所有按钮和功能都可以正常工作。 问题是20秒后,系统将收集的数 ...

6 为什么这些代码行成功执行

我对C ++和Java中的OOP非常熟悉,而我对PHP还是陌生的,毕竟PHP声称支持OOP。 我正在重构实习期间提供给我的一些代码,并且遇到了以下PHP编码风格。 根据我在C ++尤其是Java方面的经验,它甚至不会尝试编译,但是在PHP中可以很好地执行。 我知道所有语言都不尽相同, ...

2014-08-07 16:42:41 2 53   php/ oop
8 为什么我的卡片布局中没有显示第一个面板

抱歉代码转储,但我不确定是哪里导致了问题。 当我单击 Round Robin 按钮时,它应该带我到 RoundRobin 页面(它确实如此),但随后我应该能够单击开始和蓝色的中心面板应该是黄色的黄色动画面板。 当我运行这个时,我只看到黄色的动画面板,当我点击开始时,我得到一个“线程“AWT-Even ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM