簡體   English   中英

如何將不同的 MouseListener 分配給不同的 JTextField?

[英]How to assign differents MouseListener to differents JTextField?

我正在嘗試制作數獨游戲,我想在單擊 JTextField 時更改同一框、同一列和同一行的背景顏色。 我正在嘗試添加多個鼠標偵聽器,每個 JTextField 一個,但它不起作用。 我現在正在測試更改我單擊的 JTextField 的背景顏色。

主要問題在這里。

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Panel extends JPanel {

    public static final int ROWS = 3;
    public static final int COLUMNS = 3;
    public static JTextField[][] fields = new JTextField[ROWS * COLUMNS][ROWS * COLUMNS];

    for (int i = 0; i < ROWS*COLUMNS; i++) {
        for (int j = 0; j < ROWS*COLUMNS; j++) {
            fields[i][j] = new JTextField();
            int finalI = i;
            int finalJ = j;
            fields[i][j].addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    fields[finalI][finalJ].setBackground(Color.BLUE);
                }
            });
        }
    }
} 

我也試過這個,但它不起作用。

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Panel extends JPanel {

    public static final int ROWS = 3;
    public static final int COLUMNS = 3;
    public static JTextField[][] fields = new JTextField[ROWS * COLUMNS][ROWS * COLUMNS];

    for (int i = 0; i < ROWS*COLUMNS; i++) {
        for (int j = 0; j < ROWS*COLUMNS; j++) {
            fields[i][j] = new JTextField();
            addMouseActions(i, j);
        }
    }
   

    private void addMouseActions(int row, int col){
        fields[row][col].addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                fields[row][col].setBackground(Color.BLUE);
            }
        });

    }
} 

這是面板 class 的完整代碼。

import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Panel extends JPanel {

    static String[] levels = {"Easy", "Medium", "Hard"};
    public static final JComboBox<String> levelsBox = new JComboBox<>(levels);
    private final JButton playButton = new JButton("Play");
    private final JButton checkButton = new JButton("Check");
    private final JButton hintButton = new JButton("Hint");
    private final JButton solveButton = new JButton("Solve");
    private final JButton exitButton = new JButton("Exit");

    public static final int ROWS = 3;
    public static final int COLUMNS = 3;
    public static JTextField[][] fields = new JTextField[ROWS * COLUMNS][ROWS * COLUMNS];

    public Panel(JFrame frame) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {

                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocation(600, 200);
                frame.setLayout(new BorderLayout());
                frame.add(new SudokuBoard());
                frame.add(new MenuPane(), BorderLayout.AFTER_LINE_ENDS);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    public class MenuPane extends JPanel {

        public MenuPane() {
            setBorder(new EmptyBorder(4, 4, 4, 4));
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.weightx = 0;
            gbc.fill = GridBagConstraints.HORIZONTAL;

            JLabel diff = new JLabel("Select the difficulty: ");
            diff.setFont(new Font("SansSerif",Font.BOLD,18));
            add(diff, gbc);
            gbc.gridx++;

            levelsBox.setFont(new Font("SansSerif",Font.BOLD,16));
            add(levelsBox,gbc);
            gbc.gridy++;


            playButton.setActionCommand("Play");
            add(playButton, gbc);
            gbc.gridy++;

            checkButton.setActionCommand("Check");
            checkButton.setEnabled(false);
            add(checkButton, gbc);
            gbc.gridy++;

            hintButton.setActionCommand("Hint");
            hintButton.setEnabled(false);
            add(hintButton, gbc);
            gbc.gridy++;


            solveButton.setActionCommand("Solve");
            solveButton.setEnabled(false);
            add(solveButton, gbc);
            gbc.gridy++;

            exitButton.setActionCommand("Exit");
            add(exitButton, gbc);
        }
    }

    public static class SudokuBoard extends JPanel {

        private SubBoard[] subBoards;

        public SudokuBoard() {
            setBorder(new EmptyBorder(30, 30, 30, 10));
            subBoards = new SubBoard[ROWS * COLUMNS];
            setLayout(new GridLayout(ROWS, COLUMNS));
            for (int row = 0; row < ROWS; row++) {
                for (int col = 0; col < COLUMNS; col++) {
                    int bigIndex = (row * COLUMNS) + col;
                    int index = (row * ROWS) + col;
                    SubBoard board = new SubBoard(bigIndex);
                    board.setBorder(new LineBorder(Color.GRAY, 3));
                    subBoards[index] = board;
                    add(board);
                }
            }
        }
    }

    public static class SubBoard extends JPanel {

        public SubBoard(int bigIndex) {
            setLayout(new GridLayout(ROWS, COLUMNS));
            for (int row = 0; row < ROWS; row++) {
                for (int col = 0; col < COLUMNS; col++) {
                    int index = (row * COLUMNS) + col;
                    JTextField field = new JTextField();
                    field.setPreferredSize(new Dimension(60, 60));
                    field.setHorizontalAlignment(JTextField.CENTER);
                    field.setFont(new Font("SansSerif", Font.BOLD, 25));
                    field.setDocument(new JTextFieldLimit(1));
                    //field.setEditable(false);
                    fields[bigIndex][index] = field;
                    add(field);
                }
            }
        }
    }

    public void addListeners(Controller controller) {
        playButton.addActionListener(controller);
        checkButton.addActionListener(controller);
        hintButton.addActionListener(controller);
        solveButton.addActionListener(controller);
        exitButton.addActionListener(controller);
        for (int i = 0; i < ROWS*COLUMNS; i++) {
            for (int j = 0; j < ROWS*COLUMNS; j++) {
                fields[i][j] = new JTextField();
                int finalI = i;
                int finalJ = j;
                fields[i][j].addMouseListener(new MouseAdapter() {
                    @Override
                    public void mousePressed(MouseEvent e) {
                        fields[finalI][finalJ].setBackground(Color.BLUE);
                    }
                });
            }
        }
    }

    public void enableButtons(boolean enabled){
        checkButton.setEnabled(enabled);
        hintButton.setEnabled(enabled);
        solveButton.setEnabled(enabled);
    }
}

這是我用於操作事件的 Controller Class。

import pkgClient.MyClient;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Objects;

public class Controller implements ActionListener {
    Panel panel;
    JFrame frame;

    public Controller(Panel panel, JFrame frame) {
        this.frame = frame;
        this.panel = panel;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getActionCommand().equalsIgnoreCase("Play")){
            String level = Panel.levelsBox.getItemAt(Panel.levelsBox.getSelectedIndex());
            if(Objects.equals(level, "Easy")){
                MyClient.out.println("easyMode");
            }else if(Objects.equals(level, "Medium")){
                MyClient.out.println("mediumMode");
            }else if (Objects.equals(level, "Hard")){
                MyClient.out.println("hardMode");
            }
            panel.enableButtons(true);
            Panel.fields[0][0].setBackground(Color.WHITE);

        } else if(e.getActionCommand().equalsIgnoreCase("Check")){
            System.out.println("Comprobar");
            MyClient.out.println("check");
            panel.enableButtons(false);

        }else if(e.getActionCommand().equalsIgnoreCase("Hint")){
            System.out.println("Pista");
            MyClient.out.println("hint");


        } else if(e.getActionCommand().equalsIgnoreCase("Solve")){
            System.out.println("Resolver");
            MyClient.out.println("solve");
            panel.enableButtons(false);


        } else if(e.getActionCommand().equalsIgnoreCase("Exit")) {
            frame.dispose();
            MyClient.out.println("exit");
        }else if(e.getActionCommand().equalsIgnoreCase("Text")) {
            System.out.println("hola");
            Panel.fields[0][0].setBackground(Color.BLACK);

        }else{
            System.err.println("Error: unexpected event");
        }
    }
}

有什么方法可以像我在 Controller Class 中的按鈕和操作那樣為每個 JTextField 設置唯一的鼠標事件? 或者我該怎么做?

謝謝你。

我終於可以解決問題了,我只需要使用 FocusListener 而不是 MouseListener。 我可以在 FocusGained(FocusEvent event) 方法中更改字段的背景顏色,並且每個 JTextField 都有一個獨立的事件。 我可以知道在 FocusGained 方法中使用 event.getComponent() 單擊了哪個 JTextField。

暫無
暫無

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

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