2013-10-28 45 views
2

在我的节目,我有没有办法正常的窗口和全屏状态之间切换:的KeyListener不配置后工作()

public void setFullScreen(boolean enableFullScreen) { 
    Frame.fullScreen = enableFullScreen; 
    dispose(); 
    if (enableFullScreen) { 
     getContentPane().setPreferredSize(resFull); 
     setSize(resFull); 
     setBounds(Frame.graphicsDev.getConfigurations()[0].getBounds().x, Frame.graphicsDev.getConfigurations()[0].getBounds().y, resFull.width, resFull.height); 
     //code for resizing components 
     setUndecorated(true); 
     setResizable(false); 
    } else { 
     getContentPane().setSize(resNormal); 
     getContentPane().setPreferredSize(resNormal); 
     //code for resizing components 
     setUndecorated(false); 
     setResizable(true); 
    } 
    pack(); 
    setVisible(true); 
} 

resFullresNormal是维变量。

当我点击打开正常的窗口F11它改变全屏状态(setFullScreen(!Frame.fullScreen)),但改变后通常不会收到任何信号 - 我要切换到其它应用程序,然后转回到这个窗口 - 它的工作原理。

+2

你在部署和处置为什么呢? Dispose是用于删除您调用它的任何内容。 – Radiodef

+1

@Radiodef:实际配置不是为了“删除”,而是为了释放本地资源。在显示它之前,你绝对不想放置顶层窗口,但调用'pack()'和'setVisible(true)'应该重新构成本地资源。 –

+0

我不得不这样做,因为我想调用'setUndecorated()'。 – MarPiRK

回答

0

可能你的问题是由于JButton被按下时窃取焦点导致你的KeyListener正在监听未聚焦的组件。再一个解决方案是使用键绑定。

sscce,以证明自己既KeyListeners和键绑定,你试图实现转型后的正常工作:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.*; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class TestUndecoratedKeyListener { 
    protected static final int PREF_W = 400; 
    protected static final int PREF_H = PREF_W; 

    private static void createAndShowGui() { 
     final JFrame frame = new JFrame("TestUndecoratedKeyListener"); 

     final JPanel mainPanel = new JPanel() { 
     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(PREF_W, PREF_H); 
     } 
     }; 

     JToggleButton toggleButton = new JToggleButton("Full Screen"); 
     toggleButton.setFocusable(false); 
     toggleButton.setMnemonic(KeyEvent.VK_F); 
     toggleButton.addItemListener(new ItemListener() { 

     @Override 
     public void itemStateChanged(ItemEvent e) { 
      if (e.getStateChange() == ItemEvent.SELECTED) { 
       frame.dispose(); 
       frame.setUndecorated(true); 
       frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
       frame.setVisible(true); 
      } else { 
       frame.dispose(); 
       frame.setUndecorated(false); 
       frame.setExtendedState(JFrame.NORMAL); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     } 
     }); 
     mainPanel.add(toggleButton); 
     final JLabel keyListenerLabel = new JLabel(); 
     final JLabel keyBindingLabel = new JLabel(); 

     mainPanel.add(new JLabel("Press Right or Left Arrow Key To Test")); 
     mainPanel.add(keyListenerLabel); 
     mainPanel.add(keyBindingLabel); 

     keyListenerLabel.setBorder(BorderFactory.createLineBorder(Color.black)); 
     keyBindingLabel.setBorder(BorderFactory.createLineBorder(Color.black)); 

     mainPanel.addKeyListener(new KeyAdapter() { 

     @Override 
     public void keyPressed(KeyEvent e) { 
      if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
       keyListenerLabel.setText("KeyListener: left pressed"); 
      } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
       keyListenerLabel.setText("KeyListener: right pressed"); 
      } 
     } 
     }); 

     int condition = JPanel.WHEN_IN_FOCUSED_WINDOW; 
     InputMap inputMap = mainPanel.getInputMap(condition); 
     ActionMap actionMap = mainPanel.getActionMap(); 

     KeyStroke leftArrowStroke = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0); 
     KeyStroke rightArrowStroke = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0); 
     inputMap.put(leftArrowStroke, leftArrowStroke.toString()); 
     inputMap.put(rightArrowStroke, rightArrowStroke.toString()); 
     actionMap.put(leftArrowStroke.toString(), new AbstractAction() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      keyBindingLabel.setText("Key Bindings: left Arrow Pressed"); 
     } 
     }); 
     actionMap.put(rightArrowStroke.toString(), new AbstractAction() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      keyBindingLabel.setText("Key Bindings: right Arrow Pressed"); 
     } 
     }); 


     mainPanel.setFocusable(true); 
     mainPanel.requestFocusInWindow(); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

'mainPanel.requestFocusInWindow();'即使对于KeyListener也行。谢谢。 – MarPiRK