簡體   English   中英

Java:遍歷 JButton 列表

[英]Java: Iterating through a list of JButton

我的 JPanel 上有一個 JButton 的 ArrayList。 所有按鈕都使用 JPanel 上的 GridBagLayout 添加在一條水平線上,如下所示。

我的 JPanel

這樣做是為了讓 focusOwner JButton 具有紅色背景,而其他 JButton 具有綠色背景。

我想通過用戶 keboard 轉移焦點。 例如,如果用戶單擊左箭頭,則焦點轉移到具有焦點的按鈕左側的按鈕。 同樣,如果他單擊右箭頭,焦點將轉移到 focusOwner 右側的按鈕。

我還希望如果用戶按 Enter 鍵,則按下 focusOwner 按鈕(運行 actionListener)。

使用鍵綁定為每個JButton注冊所需的操作。
使用焦點偵聽器更改焦點和非焦點JButton的背景顏色。
使用鍵盤焦點管理器移動焦點。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.WindowConstants;

public class RedGreen implements ActionListener, FocusListener, Runnable {
    private JFrame  frame;

    public void actionPerformed(ActionEvent event) {
        JOptionPane.showMessageDialog(frame, event.getActionCommand());
    }

    public void focusGained(FocusEvent event) {
        event.getComponent().setBackground(Color.red);
    }

    public void focusLost(FocusEvent event) {
        event.getComponent().setBackground(Color.green);
    }

    @Override
    public void run() {
        showGui();
    }

    private JButton createButton(int index) {
        JButton button = new JButton("Ledger");
        button.setActionCommand(String.valueOf(index));
        button.addActionListener(this);
        button.setBackground(Color.green);
        button.addFocusListener(this);
        InputMap inputMap = button.getInputMap();
        ActionMap actionMap = button.getActionMap();

        KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
        inputMap.put(enter, "ACTION");
        actionMap.put("ACTION", new EnterAction());

        KeyStroke rightArrow = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0);
        inputMap.put(rightArrow, "NEXT");
        actionMap.put("NEXT", new RightAction());

        KeyStroke leftArrow = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0);
        inputMap.put(leftArrow, "PREVIOUS");
        actionMap.put("PREVIOUS", new LeftAction());

        return button;
    }
    private JPanel createButtonsPanel() {
        JPanel panel = new JPanel();
        panel.add(createButton(1));
        panel.add(createButton(2));
        panel.add(createButton(3));
        panel.add(createButton(4));
        return panel;
    }

    private void showGui() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(createButtonsPanel(), BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

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

    private static class EnterAction extends AbstractAction {
        
        @Override
        public void actionPerformed(ActionEvent event) {
            Object source = event.getSource();
            if (source instanceof JButton) {
                JButton button = (JButton) source;
                button.doClick();
            }
        }
    }

    private static class LeftAction extends AbstractAction {

        @Override
        public void actionPerformed(ActionEvent event) {
            KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
            kfm.focusPreviousComponent();
        }
    }

    private static class RightAction extends AbstractAction {

        @Override
        public void actionPerformed(ActionEvent event) {
            KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
            kfm.focusNextComponent();
        }
    }
}

暫無
暫無

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

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