簡體   English   中英

如何移動焦點按鈕?

[英]How can I move focused button?

我的 Java Swing 代碼有一些問題。

我想使用鍵盤(UP、DOWN 鍵)在按鈕之間移動,然后使用 ENTER 鍵按下按鈕。 但是我認為沒有辦法使用鍵盤。

誰能教我如何用鍵盤的 UP 和 DOWN 鍵移動按鈕?
我也用過JRadioButton ,但是很難......

下面的代碼是我的代碼!

在此處輸入圖像描述


import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class StartScreen extends JFrame {

  JButton[] buttons;
  private KeyListener playerKeyListener;

  public StartScreen() {
    setTitle("테트리스 시작 화면");

    setSize(400, 500);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(null);
    setBackground(Color.PINK);

    JPanel jPanel = new JPanel();

    jPanel.setBackground(Color.PINK);
    jPanel.setBounds(0,0,400,500);
    jPanel.setLayout(null);

    String[] btnText = {"일반 모드 게임 시작", "아이템 모드 게임 시작", "게임 설정", "스코어 보드", "게임 종료"};
    buttons = new JButton[5];
    for (int i = 0; i < buttons.length; i++) {
      buttons[i] = new JButton(btnText[i]);
      buttons[i].setBackground(new Color(0,0,0,0));
      buttons[i].setVisible(true);
      buttons[i].setBorderPainted(true);
      jPanel.add(buttons[i]);
    }

    int y = 150;
    for (int i = 0; i < buttons.length; i++) {
      buttons[i].setBounds(125, y, 150, 50);
      y += 60;
    }

    JLabel jLabel = new JLabel("Tetris");
    Font font = new Font("Arial", Font.BOLD, 40);
    jLabel.setFont(font);
    jLabel.setLayout(null);
    jLabel.setBounds(145,80,150,40);
    jPanel.add(jLabel, BorderLayout.CENTER);


    getContentPane().add(jPanel);
    setVisible(true);

    playerKeyListener = new PlayerKeyListener();
    addKeyListener(playerKeyListener);
    setFocusable(true);
    requestFocus();

  }

  public class PlayerKeyListener implements KeyListener {
    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
      switch(e.getKeyCode()) {
        case KeyEvent.VK_DOWN:

          break;
        case KeyEvent.VK_UP:

          break;
        default:
          System.out.println("");
      }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
  }

  public static void main(String[] args) {
    new StartScreen();
  }

}

以下顯示了兩種不同的方法:

  1. 將 KeyStroke 添加到焦點遍歷鍵集,它允許您更改特定組件的行為。
  2. 向面板添加一個鍵綁定,這樣您就可以對面板上的所有組件使用箭頭鍵

選擇最符合您要求的方法。

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class FocusTraversalKeys extends JPanel
{
    public FocusTraversalKeys()
    {
        for (int i = 0; i < 5; i++)
        {
            JButton button = new JButton( String.valueOf(i) );
            add( button );

            //  Add left arrow key as a focus traversal key.
            //  Applies only to this specific component.

            Set<AWTKeyStroke> set = new HashSet<AWTKeyStroke>( button.getFocusTraversalKeys(
                KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS ) );
            set.add( KeyStroke.getKeyStroke( "LEFT" ) );
            button.setFocusTraversalKeys(
                KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, set );
        }

        //  Add right arrow key as a focus traversal key.
        //  Applies to all components on the panel

        InputMap im = getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        String rightText = "RIGHT";
        im.put(KeyStroke.getKeyStroke(rightText), rightText);
        getActionMap().put(rightText, new AbstractAction()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("FocusTraversalKeys");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new FocusTraversalKeys() );
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM