Как добавить два разных события для любого JButton

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.JLabel;

    public class Proyecto_Frame extends JFrame {
    private ImageIcon Aston;
    private ImageIcon Ferrari;
    private ImageIcon Lambo;
    private ImageIcon McLaren;
/**
 * 
 */
    private static final long serialVersionUID = 1L;



        public Proyecto_Frame () {
            super ("Carrera");
            this.setLayout(null);

            Aston = new ImageIcon (getClass().getResource("Aston1.png"));
            Ferrari = new ImageIcon (getClass().getResource("Ferrari1.png"));
            Lambo = new ImageIcon (getClass().getResource("Lambo1.png"));
            McLaren = new ImageIcon (getClass().getResource("McLaren1.png"));

            final JLabel Aston1 = new JLabel(Aston);
            final JLabel Ferrari1 = new JLabel(Ferrari);
            final JLabel Lambo1 = new JLabel(Lambo);
            final JLabel McLaren1 = new JLabel(McLaren);

            final JLabel Aston2 = new JLabel(Aston);
            final JLabel Ferrari2 = new JLabel(Ferrari);
            final JLabel Lambo2 = new JLabel(Lambo);
            final JLabel McLaren2 = new JLabel(McLaren);

            JButton B_Aston = new JButton (Aston);
            JButton B_Ferrari = new JButton (Ferrari);
            JButton B_Lambo = new JButton (Lambo);
            JButton B_McLaren = new JButton (McLaren);

            B_Aston.setBounds(new java.awt.Rectangle(30,30,230,75));
            this.getContentPane().add(B_Aston);

            B_Ferrari.setBounds(new java.awt.Rectangle(270,30,230,75));
            this.getContentPane().add(B_Ferrari);

            B_Lambo.setBounds(new java.awt.Rectangle(30,110,230,75));
            this.getContentPane().add(B_Lambo);

            B_McLaren.setBounds(new java.awt.Rectangle(270,110,230,75));
            this.getContentPane().add(B_McLaren);

            add(B_Aston);
            add(B_Ferrari);
            add(B_Lambo);
            add(B_McLaren);

            Aston1.setBounds(30, 250, 230, 75);
            Aston1.setVisible(false);
            Ferrari1.setBounds(30, 250, 230, 75);
            Ferrari1.setVisible(false);
            Lambo1.setBounds(30, 250, 230, 75);
            Lambo1.setVisible(false);
            McLaren1.setBounds(30, 250, 230, 75);
            McLaren1.setVisible(false);

            Aston2.setBounds(30, 350, 230, 75);
            Aston2.setVisible(false);
            Ferrari2.setBounds(30, 350, 230, 75);
            Ferrari2.setVisible(false);
            Lambo2.setBounds(30, 350, 230, 75);
            Lambo2.setVisible(false);
            McLaren2.setBounds(30, 350, 230, 75);
            McLaren2.setVisible(false);

            add(Aston1);
            add(Ferrari1);
            add(Lambo1);
            add(McLaren1);

            add(Aston2);
            add(Ferrari2);
            add(Lambo2);
            add(McLaren2);

            B_Aston.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e){
                    Aston1.setVisible(true);
                    Ferrari1.setVisible(false);
                    Lambo1.setVisible(false);
                    McLaren1.setVisible(false);
                }
            });
            B_Ferrari.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e){
            Aston1.setVisible(false);
            Ferrari1.setVisible(true);
            Lambo1.setVisible(false);
            McLaren1.setVisible(false);
            }
            });
            B_Lambo.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e){
                    Aston1.setVisible(false);
                    Ferrari1.setVisible(false);
                    Lambo1.setVisible(true);
                    McLaren1.setVisible(false);
                }
            });
            B_McLaren.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e){
                    Aston1.setVisible(false);
                    Ferrari1.setVisible(false);
                    Lambo1.setVisible(false);
                    McLaren1.setVisible(true);

                }

            });

        }

    }

Привет, я новичок в Java и получил этот код. Итак, вопрос в том, что я хочу выделить два из этих изображений и раскрасить их под кнопками, чтобы имитировать гонку. Когда я нажимаю любую кнопку Jbutton, это изображение отображается, а остальные 3 - нет, но я не могу понять, как оставить этот выбор и сделать следующий выбор с помощью тех же кнопок JButton. Может кто-нибудь мне помочь? Я прочитал многие темы и многие другие страницы, но, похоже, не нашел ответа.

Спасибо и извините за формат, не используемый для форматирования форумов.


person VaguitoV    schedule 21.04.2012    source источник


Ответы (3)


Я бы предпочел использовать JList с отключен JButton Старт гонки под ним, для этого.

Поместите изображения в список и добавьте прослушиватель выбора списка для обнаружения выбора. Когда выбор изменится, проверьте список на наличие массив выбранных значений (1.6) или список выбранных значений (1.7+) и подсчитайте количество записей.

  1. Если число равно 1, предложите пользователю выбрать другой (используя сообщение JLabel в основном графическом интерфейсе пользователя, всплывающее окно или JOptionPane).
  2. Если число равно 2, активируйте кнопку.
  3. Если выбрано 3 или более, отключите кнопку и покажите сообщение об ошибке на основе JOptionPane с эффектом «Этот трек недостаточно велик для 3 автомобилей!».
person Andrew Thompson    schedule 22.04.2012
comment
Проблема в том, что я просто работаю с Java почти 1 неделю и не понимаю многих вещей на языке java, поэтому я пытаюсь сделать его настолько простым, насколько это возможно, хотя это означает иметь очень обширный код, как вы может увидеть я уже; хотя я буду смотреть дальше в реализации этого метода, спасибо! - person VaguitoV; 22.04.2012

Я думаю, что самый простой способ - это проверить, что если первый выбор уже сделан, то сделайте второй, например

if (playerA == null) {
    playerA = buttonSelection;
} else {
    playerB = buttonSelection;
}

Также вам понадобится какой-то способ проинструктировать пользователя, что выбирает с помощью какой кнопки.

person Juan Alberto López Cavallotti    schedule 21.04.2012

Одно из возможных решений (которое мне не особенно нравится) - использовать логическую или другую переменную (ы) для хранения состояния вашей программы, скажем, под названием boolean autoSelected = false ;. Когда выбран автоматический режим, измените значение этой переменной на true. В ActionListener JButton используйте блок if, чтобы определить, что должен делать код на основе состояния этой переменной. Другими словами, вы изменяете действие, выполняемое вашими кнопками JButton, в зависимости от состояния программы.

Хотя, на мой взгляд, лучше просто поменять местами JPanel с помощью CardLayout и отобразить JPanel, который содержит ваш трек и новые JButtons. Это связано с тем, что вы переходите из одного основного состояния вашей программы - настройки игры в другое состояние - показывая гонку, и они, вероятно, должны будут отображаться в совершенно разных JPanel.

person Hovercraft Full Of Eels    schedule 21.04.2012