Могу ли я использовать ActionListeners в JPanels?

#java #swing #user-interface #jpanel #actionlistener

#java #swing #пользовательский интерфейс #jpanel #actionlistener

Вопрос:

Я пытаюсь добавить и ActionListener к собственной JPanel, но продолжаю получать сообщение об ошибке «не удается найти символ». Мне просто интересно, возможно ли это сделать, поскольку я хочу иметь возможность щелкнуть по панели и изменить цвет. Буду признателен за любую помощь.

Вот что у меня есть на данный момент.

 import java.awt.*;
import javax.swing.*;
import javax.swing.JPanel.*;
import java.awt.Color.*;
import java.awt.event.*;
/**
 * Write a description of class SimpleFrame here.
 *
 * @author OFJ2
 * @version 
 */
public class Game extends JFrame 
            implements ActionListener
{
private final int ROWS = 5;
private final int COLUMS = 2;
private final int GAP = 2;
private final int SIZE = ROWS * COLUMS;
private int x;
private JPanel leftPanel = new JPanel(new GridLayout(ROWS,COLUMS, GAP,GAP));
private JPanel [] gridPanel = new JPanel[SIZE];
private JPanel middlePanel = new JPanel();    
private JPanel rightPanel = new JPanel();
private Color col1 = Color.GREEN;
private Color col2 = Color.YELLOW;
private Color tempColor;


public Game()
{
    super("Chasing Bombs OFJ2");
    setSize(200,200);
    setVisible(true);
    makeFrame();
}


public void makeFrame()
{
    Container contentPane = getContentPane();
    contentPane.setLayout(new GridLayout());
    leftPanel.setLayout(new GridLayout(ROWS, COLUMS));

    //JLabel label2 = new JLabel("Pocahontas");

    JButton playButton = new JButton("Play Game");
    JButton exitButton = new JButton("Exit");


    JButton easyButton = new JButton("Easy");
    JButton mediumButton = new JButton("Medium");
    JButton hardButton = new JButton("Hard");


    add(leftPanel);

    add(middlePanel, new FlowLayout());

    add(rightPanel);

    setGrid();


    middlePanel.add(playButton);
    middlePanel.add(exitButton);
    rightPanel.add(easyButton);
    rightPanel.add(mediumButton);
    rightPanel.add(hardButton);
    leftPanel.setBackground(Color.PINK);
    middlePanel.setBackground(Color.RED);

    easyButton.addActionListener(this);
    mediumButton.addActionListener(this);
    hardButton.addActionListener(this);
    playButton.addActionListener(this);
    exitButton.addActionListener(this);



}

public void setGrid()
{
    for(int x = 0; x < SIZE; x  ) {
           gridPanel[x] = new JPanel();
           gridPanel[x].setBorder(BorderFactory.createLineBorder(Color.BLACK));
           leftPanel.add(gridPanel[x]);
           gridPanel[x].setBackground(Color.GREEN);
           gridPanel[x].addActionListener(this);

        }
}

@Override
public void actionPerformed(ActionEvent e)
{
    Object source = e.getSource();
    if (source == gridPanel[0]){
        gridPanel[x].setBackground(Color.BLACK);
    }
}
}
  

Я пытался найти, есть ли какой-либо другой метод, который необходим для этого, но ничего не могу найти. Возможно ли, что мне придется добавить кнопку для заполнения каждой из панелей, чтобы это сработало?

Спасибо!

Комментарии:

1. Я попытался выполнить ‘общедоступный класс Game расширяет JFrame, реализует ActionListener, MouseListener’, но получаю другую ошибку: Game не является абстрактной и не переопределяет абстрактный метод mouseExited

2. документация JPanel не включает в себя addActionListener метод. Каким будет действие, на какое событие вы хотите отреагировать? / ваш комментарий: мог бы быть добавлен к вопросу — если вы хотите, чтобы класс реализовывал интерфейс (например MouseListener ), этот класс также должен реализовывать все методы этого интерфейса (например mouseExited )

3. Мне нужно заставить панель реагировать на щелчок мыши и менять цвет. Что вы подразумеваете под необходимостью внедрения всех методов и каковы они? спасибо @CarlosHeuberger

4. если вы хотите реализовать интерфейс, вы должны запрограммировать все методы, определенные в этом интерфейсе; что это такое: документация — но вы также можете расширить из MauseAdapter , в котором реализованы все методы (пустой), и просто переопределить тот, который вам нужен (щелчок мыши) и добавить этот прослушиватель ( addMouseListener ) на панель. Учебное пособие: Как написать прослушиватель мыши

Ответ №1:

По умолчанию addActionListener отсутствует, и приведенный ниже код является справочным предложением.

 import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

class GPanel extends JPanel {
    private List<ActionListener> listenerList = new ArrayList<>();

    public GPanel() {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                var event = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "GPanel");
                for (var i : listenerList) {
                    i.actionPerformed(event);
                }
            }
        });
    }

    public void addActionListener(ActionListener listener) {
        listenerList.add(listener);
    }
}

public class ActionListenerTest extends JFrame {
    public static void main(String[] args) {
        new ActionListenerTest();
    }

    public ActionListenerTest() {
        GPanel test = new GPanel();
        test.setBackground(Color.BLUE);
        add(test);
        test.addActionListener(e-> {
            System.out.println("Click: "   e.getActionCommand());
        });
        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }
}
  

Комментарии:

1. Так будут ли это дополнительные классы, которые нужно было бы добавить? Нет ли более простого способа изменить цвет JPanel при нажатии на нее? Спасибо

2. Также что такое «var»?

3. Это означает, что вам нужно реализовать это в вашем классе. Более простой способ — установить прослушиватель мыши напрямую, без дополнительных классов, но это не способствует повторному использованию. var это новая функция java10, которая означает, что тип переменной определяется автоматически.