繁体   English   中英

如何将 ActionListener 添加到特定的 JComponent?

[英]How do I add an ActionListener to a specific JComponent?

我正在尝试为特定的JComponent创建一个ActionListener ,但在我的代码中,有两个JComponent具有ActionListener

这是我的代码:

/**
 * 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 class 作为播放按钮的ActionListener 对于任一下拉菜单,您都不需要ActionListener 您可以在需要时在PlayListener class 中获取选定的下拉值。

我添加了对SwingUtilities invokeLater方法的调用。 此方法可确保您的 Swing 组件在Event Dispatch Thread上创建和执行。

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

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

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

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
        }

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM