想要将值从另一个 class/Array 个对象传递到 CardLayout

Want to pass values to a CardLayout from another class/Array of objects

这是消息框 class。这使用 CardLayout 格式来显示消息集。它是容器 class。与消息一起,我们发送标签上显示的相应分钟和秒值。

//Reference - SynforgeTutorials
public class MessageBox extends JFrame{
    JPanel p=new JPanel();
    CardLayout cards=new CardLayout();
    int numQs;


    int cardnumber;

    CL1 messages[]={

            new CL1("Hi! How are you doing ?",1,30,this),
            new CL1("I am good thanks",2,0,this),
            new CL1("Its a great dayoutside",0,30,this),
            new CL1("I am going to go hiking",1,0,this),
            new CL1("Maybe I will join you too",1,0,this)

    };


    public static void main(String[] args) {

        new MessageBox();
    } 

    public MessageBox(){        
        super("Message Box");
        setResizable(true);


        //setSize(500,400);
        setBounds(100, 100, 450, 226);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        p.setLayout(cards);

        numQs=messages.length;
        for(int i=0;i<numQs;i++){
            p.add(messages[i],"q"+i);
        }

        cardnumber = 0;

        cards.show(p,"q"+ cardnumber);


        add(p);
        setVisible(true);
    }

这是构成卡片的class。它有 3 个面板 - 显示消息的顶部面板,在标签上显示分钟和秒的中心面板,以及存在 OK 按钮的底部面板。单击 'OK' 按钮后,将显示下一张卡片。

public class CL1 extends JPanel implements ActionListener {
    MessageBox mb;


    //Message
    JPanel qPanel=new JPanel();

    //Timer
    JPanel tPanel=new JPanel();
    JLabel timeLbl = new JLabel("New label");
    JButton btnPause=new JButton("Pause");
    JButton btnResume=new JButton("Resume");

    //bottom
    JPanel botPanel=new JPanel();
    JButton OK=new JButton("OK");



    public CL1(String q, int userMinutes, int userSeconds, MessageBox mb){

        this.mb=mb;

        setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));


        //Message
        qPanel.add(new JLabel(q));
        add(qPanel);


        //Timer

        tPanel.add(timeLbl);
        tPanel.add(btnPause);
        tPanel.add(btnResume);

        add(tPanel);


        //bottom

        //OK.setBounds(323, 139, 97, 25);
        OK.addActionListener(this);

        botPanel.add(OK);

        add(botPanel);
    }
    ////////////////////////////////////////////////////////////////////////////////
    public void actionPerformed(ActionEvent e){
        Object src=e.getSource();
        //OK button
        if(src.equals(OK)){

            mb.OK();}

    }

}

我希望能够从另一个 class 发送消息、分钟和秒值,并且能够多次调用 MessageBox class,如下所示。 class 发送消息列表,每条相应消息的分钟和秒数。 我想用不同的消息集多次调用 MessageBox class。

Calling class
{

public static void main(String[] args) {

        String[] displaymsg1 = {"Hi! How are you doing ?","I am good thanks","Its a great dayoutside","I am going to go hiking","Maybe I will join you too"};
        int[] mins1 = {1,2,0,1,1};
        int[] secs1 = {30,0,30,0,0};
        new MessageBox(displaymsg1 ,mins1,secs1);


        String[] displaymsg2 = {"Monday","Tuesday","Wednesday","Thursday","Friday"};
        int[] mins2 = {0,1,2,3,2};
        int[] secs2 = {0,25,0,10,20};
        new MessageBox(displaymsg2,mins2,secs2);

    } 

}

我该怎么做?我更改了 MessageBox 的构造函数以接受参数并创建了一个 for 循环。但这不能识别对象数组 'messages[i]'.

public MessageBox(String displaymsg[],int mins[],int secs[]){


        super("Step Message");
        setResizable(true);

        CL1 messages[];

        for(int i=0;i<messages.length;i++)
        {
        messages[i]={

                    new CL1(displaymsg[i],mins[i],secs[i],this)

            };


        }

如有任何建议,我们将不胜感激。谢谢。

您的 error/problem 与 Swing 无关,似乎与如何即时创建数组有关。我认为你想要做的是将你的 messages 变量初始化为一个新的长度为 displaymsg.length 的 CL1 数组,然后在 for 循环中,为每个数组创建项目:

public MessageBox(String displaymsg[], int mins[], int secs[]) {
  super("Step Message");
  setResizable(true);

  messages = new CL1[displaymsg.length];

  for (int i = 0; i < messages.length; i++) {
     messages[i] = new CL1(displaymsg[i], mins[i], secs[i], this);
  }
}

话虽如此,我可能会做一些不同的事情。如果您所做的大部分工作是交换消息,那么您甚至可能不需要 CardLayout,而是可以简单地交换保存在单个 JLabel 中的文本。在不了解您的实际需求的情况下很难说。