Макет сетки, реализующий определенные кнопки ActionListener - PullRequest
2 голосов
/ 01 апреля 2012

У меня проблемы; Я пытаюсь внедрить систему бронирования в кинотеатре, но не могу установить для actionListener определенную кнопку в разных сетках. То, как я хочу, чтобы это работало, - это то, что у каждого пользователя будет сеанс, в котором он может выбрать места и цену билета, такую ​​как ставка для студента, пенсии по старости. В любом случае, я не могу добавить actionListener, поэтому, когда он выбирает места, они становятся недоступными во время работы программы. Спасибо.

// Load Libraries
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class cinemaSystem {
    // Global Variables
    JFrame frame = new JFrame(); // Creates JFrame
    JLabel title;
    JButton l[][], m[][], r[][]; // Names grid of JButtons
    JPanel panel1, panel2, panel3;

    // Constructor
    public cinemaSystem(){

            title = new JLabel("Cinema Booking");
            title.setFont(new Font("Helvetica", Font.BOLD, 30));
            title.setLocation(12,5);
            title.setSize(600, 60);

            frame.setLayout(null); // Setting Grid Layout
            // panel1.setLayout(new GridLayout(seat,row));
            l = new JButton[4][4]; // Allocating Size of Grid
            panel1 = new JPanel(new GridLayout(4,4));
            panel1.setBackground(Color.black);
            panel1.setBounds(20, 70, 200, 140);
            for(int y = 0; y <4 ; y++){
                    for(int x = 0; x < 4; x++){
                        l[x][y] = new JButton("L" + y + x); // Creates New JButton
                        // l[x][y].addActionListener(this);
                        panel1.add(l[x][y]); //adds button to grid
                    }
            }

            m = new JButton[4][2]; // Allocating Size of Grid
            panel2 = new JPanel(new GridLayout(2,4));
            panel2.setBackground(Color.black);
            panel2.setBounds(240, 140, 200, 70);
            for(int y = 0; y <2 ; y++){
                    for(int x = 0; x < 4; x++){
                        m[x][y] = new JButton("M" + y + x); // Creates New JButton
                        panel2.add(m[x][y]); //adds button to grid
                    }
            }

            r = new JButton[4][4]; // Allocating Size of Grid
            panel3 = new JPanel(new GridLayout(4,4));
            panel3.setBackground(Color.black);
            panel3.setBounds(460, 70, 200, 140);
            for(int y = 0; y <4 ; y++){
                    for(int x = 0; x < 4; x++){
                        r[x][y] = new JButton("R" + y + x); // Creates New JButton
                        panel3.add(r[x][y]); //adds button to grid
                    }
            }

            frame.add(title);
            frame.add(panel1);
            frame.add(panel2);
            frame.add(panel3);
            frame.setPreferredSize(new Dimension(680, 280));
            frame.setTitle("Cinema Booking");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack(); //sets appropriate size for frame
            frame.setVisible(true); //makes frame visible
    }

    // Main Class
    public static void main(String[] args) {
            new cinemaSystem(); //makes new ButtonGrid with 2 parameters
    }
}

1 Ответ

5 голосов
/ 01 апреля 2012

Вы можете получить текст, удерживаемый нажатой JButton, просто вызвав getActionCommand() объекта ActionEvent, переданного в метод actionPerformed(...), или узнать, какая кнопка была нажата с помощью его метода getSource(). Любой из них может помочь вам найти JButton в ваших массивах и деактивировать его.

Другие предложения:

  • Не используйте this в качестве ActionListener. Вместо этого рассмотрите возможность использования анонимного внутреннего класса или частного внутреннего класса. Это сделает ваш код намного более гибким, а ваши ActionListeners - намного проще.
  • Попробуйте следовать соглашениям об именах Java, в том числе убедиться, что имена классов начинаются с заглавных букв, а имена переменных и методов начинаются с строчных букв. Это значительно облегчит другим людям (таким как us !) Возможность быстрого понимания вашего кода.
  • Избегайте использования абсолютных макетов, так как это затрудняет поддержку вашего графического интерфейса и не позволяет гибко изменять размер вашего графического интерфейса для различных ОС или разрешений экрана. Например, ваш текущий графический интерфейс выглядит следующим образом:

enter image description here

Например, этот ActionListener покажет, какая кнопка была нажата, и деактивирует эту кнопку:

private class MyListener implements ActionListener {
  public void actionPerformed(ActionEvent e) {
     System.out.println("Button pressed: " + e.getActionCommand());
     ((JButton)e.getSource()).setEnabled(false);
  }
}

Которые могут быть добавлены к кнопкам J способом, подобным этому ...

  ActionListener listener = new MyListener();

  for (int i = 0; i < leftBtns.length; i++) {
     for (int j = 0; j < leftBtns[i].length; j++) {
        JButton btn = new JButton("L" + i + j);
        btn.setFont(btn.getFont().deriveFont(Font.BOLD, BTN_FONT_SIZE));
        btn.addActionListener(listener);
        leftPanel.add(btn);
     }
  }

Кроме того, с помощью соответствующих менеджеров компоновки создается графический интерфейс, который выглядит следующим образом: enter image description here

...