Java 位于5个不同JPanel中的JButton数组中的操作侦听器

Java 位于5个不同JPanel中的JButton数组中的操作侦听器,java,swing,jbutton,actionlistener,Java,Swing,Jbutton,Actionlistener,我有一个任务,将字母表的字母按照我在下面编码的布局放在5个面板中。当您选择一个按钮时,它会更改标签以读取所单击的按钮。 第一种方法是,我把每一个按钮分别添加到每个面板中,并添加所有的ActionListeners和文本。这是大约200行,但运作良好。我认为将JButtons放入数组并在此时添加侦听器和文本会更简洁。我能够将JFrame放到布局中,但我不知道如何使用ActionListener。我是否必须添加一个MouseListener,以确定单击了哪个面板,然后确定按钮被按下 import j

我有一个任务,将字母表的字母按照我在下面编码的布局放在5个面板中。当您选择一个按钮时,它会更改标签以读取所单击的按钮。 第一种方法是,我把每一个按钮分别添加到每个面板中,并添加所有的
ActionListeners
和文本。这是大约200行,但运作良好。我认为将
JButtons
放入数组并在此时添加侦听器和文本会更简洁。我能够将
JFrame
放到布局中,但我不知道如何使用
ActionListener
。我是否必须添加一个
MouseListener
,以确定单击了哪个面板,然后确定按钮被按下

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class JFileCabinet1 extends JFrame implements ActionListener {
    String[] lettersPanel1 = { "A", "B", "C", "D", "E", "F" };
    String[] lettersPanel2 = { "G", "H", "I", "J", "K", "L" };
    String[] lettersPanel3 = { "M", "N", "O", "P", "Q", "R" };
    String[] lettersPanel4 = { "S", "T", "U", "V", "W", "X" };
    String[] lettersPanel5 = { "Y", "Z" };

    private JPanel jp1 = new JPanel(new GridLayout(1, 6));
    private JPanel jp2 = new JPanel(new GridLayout(1, 6));
    private JPanel jp3 = new JPanel(new GridLayout(1, 6));
    private JPanel jp4 = new JPanel(new GridLayout(1, 6));
    private JPanel jp5 = new JPanel(new GridLayout(1, 6));

    private JButton jblank1 = new JButton();
    private JButton jblank2 = new JButton();
    private JButton jblank3 = new JButton();
    private JLabel jl = new JLabel("");

    private Container con = getContentPane();
    private GridLayout layout = new GridLayout(5, 1, 5, 5);

    public JFileCabinet1() {

        super("File cabinet");

        con.add(jp1);
        for (int i = 0; i < lettersPanel1.length; i++) {
            JButton button[] = new JButton[lettersPanel1.length];
            button[i] = new JButton(lettersPanel1[i]);
            jp1.add(button[i]);
            button[i].addActionListener(this);
        }

        con.add(jp2);
        for (int i = 0; i < lettersPanel2.length; i++) {
            JButton button[] = new JButton[lettersPanel2.length];
            button[i] = new JButton(lettersPanel2[i]);
            jp2.add(button[i]);
            button[i].addActionListener(this);
        }

        con.add(jp3);
        for (int i = 0; i < lettersPanel2.length; i++) {
            JButton button[] = new JButton[lettersPanel3.length];
            button[i] = new JButton(lettersPanel3[i]);
            jp3.add(button[i]);
            button[i].addActionListener(this);
        }
        con.add(jp4);
        for (int i = 0; i < lettersPanel4.length; i++) {
            JButton button[] = new JButton[lettersPanel4.length];
            button[i] = new JButton(lettersPanel4[i]);
            jp4.add(button[i]);
            button[i].addActionListener(this);
        }

        con.add(jp5);
        for (int i = 0; i < lettersPanel5.length; i++) {
            JButton button[] = new JButton[lettersPanel5.length];
            button[i] = new JButton(lettersPanel2[i]);
            jp5.add(button[i]);
            button[i].addActionListener(this);
        }

        jp5.add(jblank1).setVisible(false);
        jp5.add(jblank2).setVisible(false);
        jp5.add(jblank3).setVisible(false);

        setSize(500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setLayout(layout);
    }

    public void actionPerformed(ActionEvent e) {
        JButton src = (JButton) e.getSource();

    }

    public static void main(String[] args) {
        JFileCabinet1 frame = new JFileCabinet1();
        frame.setVisible(true);

    }
}
导入java.awt.BorderLayout;
导入java.awt.Component;
导入java.awt.Container;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.*;
公共类JFileCabinet1扩展了JFrame实现ActionListener{
字符串[]lettersPanel1={“A”、“B”、“C”、“D”、“E”、“F”};
字符串[]lettersPanel2={“G”、“H”、“I”、“J”、“K”、“L”};
字符串[]lettersPanel3={“M”、“N”、“O”、“P”、“Q”、“R”};
字符串[]lettersPanel4={“S”、“T”、“U”、“V”、“W”、“X”};
字符串[]lettersPanel5={“Y”,“Z”};
private JPanel jp1=新JPanel(新网格布局(1,6));
private JPanel jp2=新JPanel(新网格布局(1,6));
private JPanel jp3=新JPanel(新网格布局(1,6));
private JPanel jp4=新JPanel(新网格布局(1,6));
私有JPanel jp5=新JPanel(新网格布局(1,6));
私有JButton jblank1=新JButton();
私有JButton jblank2=新JButton();
私有JButton jblank3=新JButton();
私有JLabel jl=新JLabel(“”);
私有容器con=getContentPane();
私有网格布局=新网格布局(5,1,5,5);
公共JFileCabinet1(){
超级(“文件柜”);
补充条款(jp1);
对于(int i=0;i
我是否必须添加鼠标侦听器才能找到单击的面板 然后确定按钮被按下了

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class JFileCabinet1 extends JFrame implements ActionListener {
    String[] lettersPanel1 = { "A", "B", "C", "D", "E", "F" };
    String[] lettersPanel2 = { "G", "H", "I", "J", "K", "L" };
    String[] lettersPanel3 = { "M", "N", "O", "P", "Q", "R" };
    String[] lettersPanel4 = { "S", "T", "U", "V", "W", "X" };
    String[] lettersPanel5 = { "Y", "Z" };

    private JPanel jp1 = new JPanel(new GridLayout(1, 6));
    private JPanel jp2 = new JPanel(new GridLayout(1, 6));
    private JPanel jp3 = new JPanel(new GridLayout(1, 6));
    private JPanel jp4 = new JPanel(new GridLayout(1, 6));
    private JPanel jp5 = new JPanel(new GridLayout(1, 6));

    private JButton jblank1 = new JButton();
    private JButton jblank2 = new JButton();
    private JButton jblank3 = new JButton();
    private JLabel jl = new JLabel("");

    private Container con = getContentPane();
    private GridLayout layout = new GridLayout(5, 1, 5, 5);

    public JFileCabinet1() {

        super("File cabinet");

        con.add(jp1);
        for (int i = 0; i < lettersPanel1.length; i++) {
            JButton button[] = new JButton[lettersPanel1.length];
            button[i] = new JButton(lettersPanel1[i]);
            jp1.add(button[i]);
            button[i].addActionListener(this);
        }

        con.add(jp2);
        for (int i = 0; i < lettersPanel2.length; i++) {
            JButton button[] = new JButton[lettersPanel2.length];
            button[i] = new JButton(lettersPanel2[i]);
            jp2.add(button[i]);
            button[i].addActionListener(this);
        }

        con.add(jp3);
        for (int i = 0; i < lettersPanel2.length; i++) {
            JButton button[] = new JButton[lettersPanel3.length];
            button[i] = new JButton(lettersPanel3[i]);
            jp3.add(button[i]);
            button[i].addActionListener(this);
        }
        con.add(jp4);
        for (int i = 0; i < lettersPanel4.length; i++) {
            JButton button[] = new JButton[lettersPanel4.length];
            button[i] = new JButton(lettersPanel4[i]);
            jp4.add(button[i]);
            button[i].addActionListener(this);
        }

        con.add(jp5);
        for (int i = 0; i < lettersPanel5.length; i++) {
            JButton button[] = new JButton[lettersPanel5.length];
            button[i] = new JButton(lettersPanel2[i]);
            jp5.add(button[i]);
            button[i].addActionListener(this);
        }

        jp5.add(jblank1).setVisible(false);
        jp5.add(jblank2).setVisible(false);
        jp5.add(jblank3).setVisible(false);

        setSize(500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setLayout(layout);
    }

    public void actionPerformed(ActionEvent e) {
        JButton src = (JButton) e.getSource();

    }

    public static void main(String[] args) {
        JFileCabinet1 frame = new JFileCabinet1();
        frame.setVisible(true);

    }
}
不,不要在按钮上使用鼠标侦听器。您的
ActionListener
实现很好,
getSource
将为您提供按下的按钮

要将标签设置为按钮的文本,请使用
jl.setText(src.getText())
inside
actionPerformed

如果需要按钮所在的面板,请使用按钮的
getParent()

我是否必须添加鼠标侦听器才能找到单击的面板 然后确定按钮被按下了

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class JFileCabinet1 extends JFrame implements ActionListener {
    String[] lettersPanel1 = { "A", "B", "C", "D", "E", "F" };
    String[] lettersPanel2 = { "G", "H", "I", "J", "K", "L" };
    String[] lettersPanel3 = { "M", "N", "O", "P", "Q", "R" };
    String[] lettersPanel4 = { "S", "T", "U", "V", "W", "X" };
    String[] lettersPanel5 = { "Y", "Z" };

    private JPanel jp1 = new JPanel(new GridLayout(1, 6));
    private JPanel jp2 = new JPanel(new GridLayout(1, 6));
    private JPanel jp3 = new JPanel(new GridLayout(1, 6));
    private JPanel jp4 = new JPanel(new GridLayout(1, 6));
    private JPanel jp5 = new JPanel(new GridLayout(1, 6));

    private JButton jblank1 = new JButton();
    private JButton jblank2 = new JButton();
    private JButton jblank3 = new JButton();
    private JLabel jl = new JLabel("");

    private Container con = getContentPane();
    private GridLayout layout = new GridLayout(5, 1, 5, 5);

    public JFileCabinet1() {

        super("File cabinet");

        con.add(jp1);
        for (int i = 0; i < lettersPanel1.length; i++) {
            JButton button[] = new JButton[lettersPanel1.length];
            button[i] = new JButton(lettersPanel1[i]);
            jp1.add(button[i]);
            button[i].addActionListener(this);
        }

        con.add(jp2);
        for (int i = 0; i < lettersPanel2.length; i++) {
            JButton button[] = new JButton[lettersPanel2.length];
            button[i] = new JButton(lettersPanel2[i]);
            jp2.add(button[i]);
            button[i].addActionListener(this);
        }

        con.add(jp3);
        for (int i = 0; i < lettersPanel2.length; i++) {
            JButton button[] = new JButton[lettersPanel3.length];
            button[i] = new JButton(lettersPanel3[i]);
            jp3.add(button[i]);
            button[i].addActionListener(this);
        }
        con.add(jp4);
        for (int i = 0; i < lettersPanel4.length; i++) {
            JButton button[] = new JButton[lettersPanel4.length];
            button[i] = new JButton(lettersPanel4[i]);
            jp4.add(button[i]);
            button[i].addActionListener(this);
        }

        con.add(jp5);
        for (int i = 0; i < lettersPanel5.length; i++) {
            JButton button[] = new JButton[lettersPanel5.length];
            button[i] = new JButton(lettersPanel2[i]);
            jp5.add(button[i]);
            button[i].addActionListener(this);
        }

        jp5.add(jblank1).setVisible(false);
        jp5.add(jblank2).setVisible(false);
        jp5.add(jblank3).setVisible(false);

        setSize(500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setLayout(layout);
    }

    public void actionPerformed(ActionEvent e) {
        JButton src = (JButton) e.getSource();

    }

    public static void main(String[] args) {
        JFileCabinet1 frame = new JFileCabinet1();
        frame.setVisible(true);

    }
}
不,不要在按钮上使用鼠标侦听器。您的
ActionListener
实现很好,
getSource
将为您提供按下的按钮

要将标签设置为按钮的文本,请使用
jl.setText(src.getText())
inside
actionPerformed


如果您想要按钮所在的面板,请使用按钮的
getParent()

事实是,一旦启动
actionPerformed
,您实际上不需要数组,直接用于
ActionListener
,您可以从
ActionEvent
s源属性获取
JButton
,并从按钮提取文本

public void actionPerformed(ActionEvent e) {
    JButton src = (JButton) e.getSource();
    System.out.println(src.getText());
}
现在,如果您希望按钮包含更多信息(或显示的信息不同),可以使用按钮
actionCommand
属性

还有,这个

for (int i = 0; i < lettersPanel2.length; i++) {
    JButton button[] = new JButton[lettersPanel2.length];
简单地说,就像

addButtonsTo(lettersPanel1, jp1);
addButtonsTo(lettersPanel2, jp2);
addButtonsTo(lettersPanel3, jp3);
addButtonsTo(lettersPanel4, jp4);
addButtonsTo(lettersPanel5, jp5);

通读一遍,了解更多细节…

事实上,对于
ActionListener
,您实际上不需要直接使用数组,一旦启动
actionPerformed
,您就可以从
ActionEvent
的源属性中获取
JButton
,并从按钮中提取文本

public void actionPerformed(ActionEvent e) {
    JButton src = (JButton) e.getSource();
    System.out.println(src.getText());
}
现在,如果您希望按钮携带更多信息(或不同的信息)