如何将ActionListener添加到特定的JComponent



我试图为特定的JComponent生成ActionListener,但在我的代码中,有两个JComponent具有ActionListeners。

这是我的代码:

/**
* This is a Java Swing program that lets you play Minesweeper! Make sure to play it in fullscreen or else it's not going to work.
* @author  Joshua Diocares
* @version  JDK14.0
* @since  Still in development!
*/
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
/**
* A class that shows the xy coordinates near the mouse cursor.
*/
class AlsXYMouseLabelComponent extends JComponent {
public int x;
public int y;
/**
* Uses the xy coordinates to update the mouse cursor label.
*/
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
String coordinates = x + ", " + y; // Get the cordinates of the mouse
g.setColor(Color.red);
g.drawString(coordinates, x, y); // Display the coordinates of the mouse
}
}
public class Minesweeper implements ActionListener {
private static JComboBox < String > gameModeDropdown;
private static JComboBox < String > difficultyDropdown;
public static void main(String[] args) {
JPanel panel = new JPanel();
JFrame frame = new JFrame();
frame = new JFrame();
frame.setSize(1365, 767);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Tic Tac Toe");
frame.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
frame.setVisible(true);
frame.add(panel);
panel.setLayout(null);
AlsXYMouseLabelComponent alsXYMouseLabel = new AlsXYMouseLabelComponent();
/**
* Add the component to the DRAG_LAYER of the layered pane (JLayeredPane)
*/
JLayeredPane layeredPane = frame.getRootPane().getLayeredPane();
layeredPane.add(alsXYMouseLabel, JLayeredPane.DRAG_LAYER);
alsXYMouseLabel.setBounds(0, 0, frame.getWidth(), frame.getHeight());
/**
* Add a mouse motion listener, and update the crosshair mouse cursor with the xy coordinates as the user moves the mouse
*/
frame.addMouseMotionListener(new MouseMotionAdapter() {
/**
* Detects when the mouse moved and what the mouse's coordinates are.
* @param event the event that happens when the mouse is moving.
*/
@Override
public void mouseMoved(MouseEvent event) {
alsXYMouseLabel.x = event.getX();
alsXYMouseLabel.y = event.getY();
alsXYMouseLabel.repaint();
}
});
JLabel title = new JLabel("Minesweeper");
title.setBounds(500, 100, 550, 60);
title.setFont(new Font("Verdana", Font.PLAIN, 50));
panel.add(title);
JLabel gameModePrompt = new JLabel("Game Mode: ");
gameModePrompt.setBounds(280, 335, 300, 25);
gameModePrompt.setFont(new Font("Verdana", Font.PLAIN, 20));
panel.add(gameModePrompt);
String[] gameModes = {
"Normal"
};
JComboBox < String > gameModeDropdown = new JComboBox < String > (gameModes);
gameModeDropdown.setBounds(415, 335, 290, 25);
gameModeDropdown.setFont(new Font("Verdana", Font.PLAIN, 20));
gameModeDropdown.addActionListener(new Minesweeper());
panel.add(gameModeDropdown);
JLabel difficultyPrompt = new JLabel("Difficulty: ");
difficultyPrompt.setBounds(800, 335, 240, 25);
difficultyPrompt.setFont(new Font("Verdana", Font.PLAIN, 20));
panel.add(difficultyPrompt);
String[] difficulties = {
"Medium"
};
JComboBox < String > difficultyDropdown = new JComboBox < String > (difficulties);
difficultyDropdown.setBounds(910, 335, 120, 25);
difficultyDropdown.setFont(new Font("Verdana", Font.PLAIN, 20));
panel.add(difficultyDropdown);
JButton playButton = new JButton("Play");
playButton.setBounds(530, 480, 220, 25);
playButton.setFont(new Font("Verdana", Font.PLAIN, 20));
playButton.addActionListener(new Minesweeper());
panel.add(playButton);
}

@Override
public void actionPerformed(ActionEvent e) {
}
}

任何建议都会对非常有帮助

我清理了您的代码。我在您的"播放"按钮中添加了一个PlayListener类作为ActionListener。两个下拉列表都不需要ActionListener。当您需要PlayListener类中的下拉值时,您可以获取这些下拉值。

我添加了对SwingUtilitiesinvokeLater方法的调用。此方法确保在事件调度线程上创建和执行Swing组件。

我重新安排了您的JFrame方法调用。我不知道您是否注意到,但在创建组件之前,您已经使JFrame可见。在显示JFrame之前,您必须创建所有组件。

不鼓励使用零布局和绝对定位。Swing GUI必须在具有不同屏幕监视器像素大小的不同操作系统上运行。你的GUI几乎不适合我的显示器。我没有理会您的绝对定位代码,但在将来,您应该学会使用Swing布局管理器。

我将AlsXYMouseLabelComponent类设置为内联类。您可以拥有任意数量的内联类。不过,一般来说,每个类都应该在一个单独的文件中。我使类内联是为了向您展示内联类是如何定义的,也为了粘贴一个可运行的示例文件。

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Minesweeper implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Minesweeper());
}
private JComboBox<String> gameModeDropdown;
private JComboBox<String> difficultyDropdown;
@Override
public void run() {
JPanel panel = new JPanel();
JFrame frame = new JFrame("Minesweeper");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
panel.setLayout(null);
AlsXYMouseLabelComponent alsXYMouseLabel =
new AlsXYMouseLabelComponent();
/**
* Add the component to the DRAG_LAYER of the layered pane (JLayeredPane)
*/
JLayeredPane layeredPane = frame.getRootPane().getLayeredPane();
layeredPane.add(alsXYMouseLabel, JLayeredPane.DRAG_LAYER);
alsXYMouseLabel.setBounds(0, 0, frame.getWidth(), frame.getHeight());
/**
* Add a mouse motion listener, and update the crosshair mouse cursor with the
* xy coordinates as the user moves the mouse
*/
frame.addMouseMotionListener(new MouseMotionAdapter() {
/**
* Detects when the mouse moved and what the mouse's coordinates are.
*
* @param event the event that happens when the mouse is moving.
*/
@Override
public void mouseMoved(MouseEvent event) {
alsXYMouseLabel.x = event.getX();
alsXYMouseLabel.y = event.getY();
alsXYMouseLabel.repaint();
}
});
JLabel title = new JLabel("Minesweeper");
title.setBounds(500, 100, 550, 60);
title.setFont(new Font("Verdana", Font.PLAIN, 50));
panel.add(title);
JLabel gameModePrompt = new JLabel("Game Mode: ");
gameModePrompt.setBounds(280, 335, 300, 25);
gameModePrompt.setFont(new Font("Verdana", Font.PLAIN, 20));
panel.add(gameModePrompt);
String[] gameModes = { "Normal" };
gameModeDropdown = new JComboBox<String>(gameModes);
gameModeDropdown.setBounds(415, 335, 290, 25);
gameModeDropdown.setFont(new Font("Verdana", Font.PLAIN, 20));
panel.add(gameModeDropdown);
JLabel difficultyPrompt = new JLabel("Difficulty: ");
difficultyPrompt.setBounds(800, 335, 240, 25);
difficultyPrompt.setFont(new Font("Verdana", Font.PLAIN, 20));
panel.add(difficultyPrompt);
String[] difficulties = { "Easy", "Medium", "Hard" };
difficultyDropdown = new JComboBox<String>(difficulties);
difficultyDropdown.setSelectedIndex(1);
difficultyDropdown.setBounds(910, 335, 120, 25);
difficultyDropdown.setFont(new Font("Verdana", Font.PLAIN, 20));
panel.add(difficultyDropdown);
JButton playButton = new JButton("Play");
playButton.setBounds(530, 480, 220, 25);
playButton.setFont(new Font("Verdana", Font.PLAIN, 20));
playButton.addActionListener(new PlayListener());
panel.add(playButton);
frame.add(panel);
frame.setSize(1365, 767);
frame.setVisible(true);
}
public class PlayListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) {
// TODO Auto-generated method stub
}
}
/**
* A class that shows the xy coordinates near the mouse cursor.
*/
public class AlsXYMouseLabelComponent extends JComponent {
private static final long serialVersionUID = 1L;
public int x;
public int y;
/**
* Uses the xy coordinates to update the mouse cursor label.
*/
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
String coordinates = x + ", " + y; // Get the cordinates of the mouse
g.setColor(Color.red);
g.drawString(coordinates, x, y); // Display the coordinates of the mouse
}
}
}

最新更新