2010-08-17 53 views
1

我需要移動窗體上的Label控件。Java/Swing + NetBeans 6.1。鍵盤事件不起作用

我在NetBeans 6.1中創建了一個「Java桌面應用程序」。

我已添加以下代碼:

但是標籤不動。

爲什麼?

/* 
* DesktopApplication1View.java 
*/ 

package desktopapplication1; 

import org.jdesktop.application.Action; 
import org.jdesktop.application.ResourceMap; 
import org.jdesktop.application.SingleFrameApplication; 
import org.jdesktop.application.FrameView; 
import org.jdesktop.application.TaskMonitor; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import javax.swing.Timer; 
import javax.swing.Icon; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 

/** 
* The application's main frame. 
*/ 
public class DesktopApplication1View extends FrameView { 

    public DesktopApplication1View(SingleFrameApplication app) 
    { 
     super(app); 

     initComponents(); 

     // status bar initialization - message timeout, idle icon and busy animation, etc 
     ResourceMap resourceMap = getResourceMap(); 
     int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout"); 
     messageTimer = new Timer(messageTimeout, new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       statusMessageLabel.setText(""); 
      } 
     }); 
     messageTimer.setRepeats(false); 
     int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate"); 
     for (int i = 0; i < busyIcons.length; i++) { 
      busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]"); 
     } 
     busyIconTimer = new Timer(busyAnimationRate, new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       busyIconIndex = (busyIconIndex + 1) % busyIcons.length; 
       statusAnimationLabel.setIcon(busyIcons[busyIconIndex]); 
      } 
     }); 
     idleIcon = resourceMap.getIcon("StatusBar.idleIcon"); 
     statusAnimationLabel.setIcon(idleIcon); 
     progressBar.setVisible(false); 

     // connecting action tasks to status bar via TaskMonitor 
     TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext()); 
     taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() { 
      public void propertyChange(java.beans.PropertyChangeEvent evt) { 
       String propertyName = evt.getPropertyName(); 
       if ("started".equals(propertyName)) { 
        if (!busyIconTimer.isRunning()) { 
         statusAnimationLabel.setIcon(busyIcons[0]); 
         busyIconIndex = 0; 
         busyIconTimer.start(); 
        } 
        progressBar.setVisible(true); 
        progressBar.setIndeterminate(true); 
       } else if ("done".equals(propertyName)) { 
        busyIconTimer.stop(); 
        statusAnimationLabel.setIcon(idleIcon); 
        progressBar.setVisible(false); 
        progressBar.setValue(0); 
       } else if ("message".equals(propertyName)) { 
        String text = (String)(evt.getNewValue()); 
        statusMessageLabel.setText((text == null) ? "" : text); 
        messageTimer.restart(); 
       } else if ("progress".equals(propertyName)) { 
        int value = (Integer)(evt.getNewValue()); 
        progressBar.setVisible(true); 
        progressBar.setIndeterminate(false); 
        progressBar.setValue(value); 
       } 
      } 
     }); 

     jLabel1.isOptimizedDrawingEnabled(); 
     jLabel1.requestFocusInWindow(); 
    } 

    @Action 
    public void showAboutBox() { 
     if (aboutBox == null) { 
      JFrame mainFrame = DesktopApplication1.getApplication().getMainFrame(); 
      aboutBox = new DesktopApplication1AboutBox(mainFrame); 
      aboutBox.setLocationRelativeTo(mainFrame); 
     } 
     DesktopApplication1.getApplication().show(aboutBox); 
    } 

    /** This method is called from within the constructor to 
    * initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is 
    * always regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     mainPanel = new javax.swing.JPanel(); 
     jLabel1 = new javax.swing.JLabel(); 
     menuBar = new javax.swing.JMenuBar(); 
     javax.swing.JMenu fileMenu = new javax.swing.JMenu(); 
     javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem(); 
     javax.swing.JMenu helpMenu = new javax.swing.JMenu(); 
     javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem(); 
     statusPanel = new javax.swing.JPanel(); 
     javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator(); 
     statusMessageLabel = new javax.swing.JLabel(); 
     statusAnimationLabel = new javax.swing.JLabel(); 
     progressBar = new javax.swing.JProgressBar(); 

     mainPanel.setName("mainPanel"); // NOI18N 

     org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopapplication1.DesktopApplication1.class).getContext().getResourceMap(DesktopApplication1View.class); 
     jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N 
     jLabel1.setName("jLabel1"); // NOI18N 
     jLabel1.addKeyListener(new java.awt.event.KeyAdapter() { 
      public void keyPressed(java.awt.event.KeyEvent evt) { 
       jLabel1KeyPressed(evt); 
      } 
     }); 

     javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel); 
     mainPanel.setLayout(mainPanelLayout); 
     mainPanelLayout.setHorizontalGroup(
      mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(mainPanelLayout.createSequentialGroup() 
       .addGap(151, 151, 151) 
       .addComponent(jLabel1) 
       .addContainerGap(215, Short.MAX_VALUE)) 
     ); 
     mainPanelLayout.setVerticalGroup(
      mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(mainPanelLayout.createSequentialGroup() 
       .addGap(83, 83, 83) 
       .addComponent(jLabel1) 
       .addContainerGap(155, Short.MAX_VALUE)) 
     ); 

     menuBar.setName("menuBar"); // NOI18N 

     fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N 
     fileMenu.setName("fileMenu"); // NOI18N 

     javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(desktopapplication1.DesktopApplication1.class).getContext().getActionMap(DesktopApplication1View.class, this); 
     exitMenuItem.setAction(actionMap.get("quit")); // NOI18N 
     exitMenuItem.setName("exitMenuItem"); // NOI18N 
     fileMenu.add(exitMenuItem); 

     menuBar.add(fileMenu); 

     helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N 
     helpMenu.setName("helpMenu"); // NOI18N 

     aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N 
     aboutMenuItem.setName("aboutMenuItem"); // NOI18N 
     helpMenu.add(aboutMenuItem); 

     menuBar.add(helpMenu); 

     statusPanel.setName("statusPanel"); // NOI18N 

     statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N 

     statusMessageLabel.setName("statusMessageLabel"); // NOI18N 

     statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); 
     statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N 

     progressBar.setName("progressBar"); // NOI18N 

     javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel); 
     statusPanel.setLayout(statusPanelLayout); 
     statusPanelLayout.setHorizontalGroup(
      statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) 
      .addGroup(statusPanelLayout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(statusMessageLabel) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 226, Short.MAX_VALUE) 
       .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(statusAnimationLabel) 
       .addContainerGap()) 
     ); 
     statusPanelLayout.setVerticalGroup(
      statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(statusPanelLayout.createSequentialGroup() 
       .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(statusMessageLabel) 
        .addComponent(statusAnimationLabel) 
        .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addGap(3, 3, 3)) 
     ); 

     setComponent(mainPanel); 
     setMenuBar(menuBar); 
     setStatusBar(statusPanel); 
    }// </editor-fold> 

private void jLabel1KeyPressed(java.awt.event.KeyEvent evt) {         
// TODO add your handling code here: 
    int keyCode = evt.getKeyCode(); 
    int xPos = jLabel1.getX(); 
    int yPos = jLabel1.getY();  

    switch(keyCode) 
    { 
     case KeyEvent.VK_UP: 
      jLabel1.setLocation(xPos, --yPos); 
      break; 

     case KeyEvent.VK_DOWN: 
      jLabel1.setLocation(xPos, ++yPos); 
      break; 

     case KeyEvent.VK_LEFT: 
      jLabel1.setLocation(--xPos, yPos); 
      break; 

     case KeyEvent.VK_RIGHT: 
      jLabel1.setLocation(++xPos, yPos); 
      break; 
    } 
}         

    // Variables declaration - do not modify 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JPanel mainPanel; 
    private javax.swing.JMenuBar menuBar; 
    private javax.swing.JProgressBar progressBar; 
    private javax.swing.JLabel statusAnimationLabel; 
    private javax.swing.JLabel statusMessageLabel; 
    private javax.swing.JPanel statusPanel; 
    // End of variables declaration 

    private final Timer messageTimer; 
    private final Timer busyIconTimer; 
    private final Icon idleIcon; 
    private final Icon[] busyIcons = new Icon[15]; 
    private int busyIconIndex = 0; 

    private JDialog aboutBox; 
} 

回答

1

看看Swing tutorial

1)只有具有焦點的組件才能接收KeyEvent。默認情況下,JLabel不可聚焦,所以它永遠不會收到KeyEvent。更好的方法是使用Key Bindings。請參閱關鍵綁定的Swing教程部分。 2)如果你修正了1,那麼標籤可能會移動,但如果框架被調整大小,它將不會停留在新的位置,因爲佈局管理器將被調用,並將根據其規則重新定位標籤。

閱讀使用佈局管理器的Swing教程中的部分。如果您確實需要標籤處於隨機位置,那麼您將需要使用本教程中討論過的絕對定位。