【问题标题】:Storing Strings from JLabel Array to String Array将字符串从 JLabel 数组存储到字符串数组
【发布时间】:2019-11-23 12:39:27
【问题描述】:

我正在努力制作一个需要执行以下操作的小程序:

  1. 右键单击面板,单击“添加”选项。它需要在 JLabel ArrayList 中动态添加 JLabels。
  2. 同时将 JLabel 文本存储在字符串的 ArrayList 中。
  3. 打印该 arrayList 以测试它是否成功地将文本存储在数组中。
  4. 稍后我会以某种方式进一步保存该文本。目前还不是问题。

我被困住了,因为我似乎不知道如何将该文本从一个数组传输到另一个数组。

那该怎么做?

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Arrays;

import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import javax.swing.MenuElement;

public class A {

    JFrame frame;
    Toolkit toolkit;
    JPopupMenu quickMenu;
    JTextField field1;
    JPanel panel;

    ArrayList<JLabel> labelList;
    ArrayList<String> stringArray;
    String texts;

    JLabel label1, label2, label3;
    ArrayList<JTextField> fieldList;
    int count;

    A() {

        frame = new JFrame("A class");

        panel = new JPanel();
        panel.setLayout(new GridLayout(2, 3, 5, 5));

        JLabel title1 = new JLabel("Title 1");
        panel.add(title1);

        setDimm(frame);

        quickMenu = new JPopupMenu();
        JMenuItem addRow = new JMenuItem("Add row");
        JMenuItem removeRow = new JMenuItem("Remove row");

        quickMenu.add(addRow);
        quickMenu.add(removeRow);
        panel.add(quickMenu);

        panel.addMouseListener(new MouseAdapter() {
            public void mouseReleased(MouseEvent e) {
                if (e.getButton() == e.BUTTON3) {
                    quickMenu.show(e.getComponent(), e.getX(), e.getY());
                }

            }
        });

        labelList = new <JLabel>ArrayList();

        // ADD ROWS
    count = 0;
    stringArray = new ArrayList();

    addRow.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            System.out.println("Starting count is: " + count); // check if
                                                                // count
            JLabel label = new JLabel ("" + count);                                                 // starts
                                                                // correctly
            labelList.add(label); // adds new
                                                            // JLabels in
                                                            // the labelList
                                                            // array

            // I suspect the problem is here underneath, not sure how to
            // first get the texts inside the arraylist of JLabels and then
            // transfer this text to the array of Strings that I want to
            // print.
            for (int i = 0; i < labelList.size(); i++) {

                stringArray.add(labelList.get(i).getText());

            }

            panel.add(labelList.get(count));
            panel.revalidate();
            panel.repaint();

            count++;

            System.out.println("After Click count is: " + count);
            System.out.println("Size of JLabel Array labelList is: " + labelList.size());
            System.out.println("Size of String Array stringArray is: " + stringArray.size());               
            System.out.print("The content of the String ArrayList is: " + stringArray);
            System.out.println();
            System.out.println();               


        }

    });

        removeRow.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev)

            {
                /*
                 * panel.remove(labelList.size() - 1); // Will it delete the
                 * last JLabel from the panel?
                 * labelList.remove(labelList.size()-1);
                 * 
                 * 
                 * panel.revalidate(); panel.repaint(); count--;
                 */
                System.out.println(count + " and does nothing yet");

            }

        });

        frame.add(panel);

        // panel.add(button);
        frame.setVisible(true);
    }

    void setDimm(JFrame frame) {
        this.frame = frame;
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.getContentPane().setBackground(Color.gray);
        frame.setSize(800, 600);
        toolkit = frame.getToolkit();
        Dimension size = toolkit.getScreenSize();
        frame.setLocation((size.width - frame.getWidth()) / 2, (size.height - frame.getHeight()) / 2);

    }

    public static void main(String[] args) {
        new A();
    }
}

【问题讨论】:

  • 你得到了什么错误/异常?
  • 没有错误。它只是过度迭代第二个数组。起始计数为:2 点击后计数为:3 JLabel Array labelList 的大小为:3 String Array stringArray 的大小为:6 ArrayList 为:[0, 0, 1, 0, 1, 2]
  • 从您发布的代码中:我怀疑问题出在下面您的怀疑是正确的。根据您发布的代码,每次选择 Add row 菜单选项时,都会向labelList 添加一个新的JLabel,然后添加 ALL 的文本标签到stringArray。只需将新标签的文本添加到stringArray。不需要循环。
  • 哈哈。杰出的。有效。谢谢。如果需要帮助,我会更新代码以显示给其他人

标签: java arrays string swing jlabel


【解决方案1】:

您使用此代码向 ArrayList 添加文本:

stringArray.add(labelList.get(i).toString());

将其替换为标签文本:

stringArray.add(labelList.get(i).getText());

你也没有一直迭代标签列表,只实例化新标签,将它添加到标签列表并将标签文本添加到字符串列表:

JLabel label = new JLabel("" + count);
                                                // correctly
labelList.add(label); // adds new
                                                // JLabels in
                                                // the labelList
                                                // array

// I suspect the problem is here underneath, not sure how to
// first get the texts inside the arraylist of JLabels and then
// transfer this text to the array of Strings that I want to
// print.
stringArray.add(label.getText());

【讨论】:

  • 你好。我也试过了,显然现在它迭代了多次字符串数组。出于调试的目的,我添加了 println 以了解两个数组的长度,并且字符串一个变为 1、3、6、10、15,而 JLabel 数组从 1、2、3、4、5 开始正确。下面的示例: JLabel 数组 labelList 的大小为:6 字符串数组 stringArray 的大小为:15 ArrayList 为:[0, 0, 1, 0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3 , 4] .我已经用这个错误更新了初始代码
  • 回到这个问题我认为解决方案不正确。它似乎只获取 jlabel 数组中的最后一个值,但它不能正确识别标签数组中的所有 jlabel
【解决方案2】:

你好。我也试过了,显然现在它迭代了多次字符串数组。出于调试的目的,我添加了 println 以了解两个数组的长度,并且字符串一个变为 1、3、6、10、15,而 JLabel 数组从 1、2、3、4、5 开始正确。下面的示例: JLabel 数组 labelList 的大小为:6 字符串数组 stringArray 的大小为:15 ArrayList 为:[0, 0, 1, 0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3 , 4] .我已经用这个错误更新了初始代码

是的,只替换此代码:

for (int i = 0; i < labelList.size(); i++) {

    stringArray.add(labelList.get(i).getText());

} 

用这个:

stringArray.add(label.getText());

【讨论】:

    【解决方案3】:

    Abra 和 ZamarianPatrick 解决了这个问题。如果其他人可能正在搜索此解决方案,我将发布代码。就是这么简单...谢谢大家!!!

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.JTextField;
    
    public class A {
    
        JFrame frame;
        Toolkit toolkit;
        JPopupMenu quickMenu;
        JTextField field1;
        JPanel panel;
    
        ArrayList<JLabel> labelList;
        ArrayList<String> stringArray;
        String texts;
    
        JLabel label1, label2, label3;
        ArrayList<JTextField> fieldList;
        int count;
    
        A() {
    
            frame = new JFrame("A class");
    
            panel = new JPanel();
            panel.setLayout(new GridLayout(2, 3, 5, 5));
    
            JLabel title1 = new JLabel("Title 1");
            panel.add(title1);
    
            setDimm(frame);
    
            quickMenu = new JPopupMenu();
            JMenuItem addRow = new JMenuItem("Add row");
            JMenuItem removeRow = new JMenuItem("Remove row");
    
            quickMenu.add(addRow);
            quickMenu.add(removeRow);
            panel.add(quickMenu);
    
            panel.addMouseListener(new MouseAdapter() {
                public void mouseReleased(MouseEvent e) {
                    if (e.getButton() == e.BUTTON3) {
                        quickMenu.show(e.getComponent(), e.getX(), e.getY());
                    }
    
                }
            });
    
            labelList = new <JLabel>ArrayList();
    
            // ADD ROWS
            count = 0;
            stringArray = new ArrayList();
    
            addRow.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
    
                    System.out.println("Starting count is: " + count); // check if
                    texts = "" + count; // count
                    JLabel label = new JLabel(texts); // starts
                    // correctly
                    labelList.add(label); // adds new
                                            // JLabels in
                                            // the labelList
    
                    stringArray.add(label.getText());
    
                    panel.add(labelList.get(count));
                    panel.revalidate();
                    panel.repaint();
    
                    count++;
    
                    System.out.println("After Click count is: " + count);
    
                    System.out.println("Size of JLabel Array labelList is: " + labelList.size());
                    System.out.println("Size of String Array stringArray is: " + stringArray.size());
                    System.out.print("The content of the String ArrayList is: " + stringArray);
                    System.out.println();
                    System.out.println();
    
                }
    
            });
    
            removeRow.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ev)
    
                {
                    /*
                     * panel.remove(labelList.size() - 1); // Will it delete the
                     * last JLabel from the panel?
                     * labelList.remove(labelList.size()-1);
                     * 
                     * 
                     * panel.revalidate(); panel.repaint(); count--;
                     */
                    System.out.println(count + " and does nothing yet");
    
                }
    
            });
    
            frame.add(panel);
    
            // panel.add(button);
            frame.setVisible(true);
        }
    
        void setDimm(JFrame frame) {
            this.frame = frame;
            frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
            frame.getContentPane().setBackground(Color.gray);
            frame.setSize(800, 600);
            toolkit = frame.getToolkit();
            Dimension size = toolkit.getScreenSize();
            frame.setLocation((size.width - frame.getWidth()) / 2, (size.height - frame.getHeight()) / 2);
    
        }
    
        public static void main(String[] args) {
            new A();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 2019-07-02
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多