【问题标题】:How to give names to items in an array in java?如何在java中为数组中的项目命名?
【发布时间】:2014-02-27 21:10:21
【问题描述】:

我已经创建了 JFields 数组;

JFields[] field = new JField[5];

for(int j = 0; i < 5; i++) {
    field[j] = new JField();
}

我要做的是给数组中的每个项目一个名称,例如,field1、field2、field3、field4、field5。

我试过这样完成;

String[] field = {field1, field2, field3, field4, field5}

也尝试过这样做;

field[j] = {field1, field2, field3, field4, field5}

但两者都不起作用。谁能告诉我怎么做,谢谢。

另外,我如何从该数组中调用单个项目

我尝试了例如field[0] OR field[1] 等,但这不起作用。

谢谢

【问题讨论】:

  • 你不是说JTextField field1 = field[0]; JTextField field2 = field[1];...
  • 您的 for 循环有错字 (i->j)
  • “我尝试了例如 field[0] OR field[1] 等,但那不起作用。”请详细说明这一点。我不明白你尝试了什么,以及你没有设法获得什么。
  • @user3325350 如果答案满足您的需求,请不要忘记接受答案(单击复选标记)。它让其他人知道该问题已被回答,它会奖励您接受答案的 2 分,并奖励 15 分给提供答案的人。

标签: java arrays


【解决方案1】:

这就是你的数组的用途。因为您有一个名为 fields 的 JTextField 数组,所以您已经为数组中的项目(例如 field[2] 和 field[3])获得了“名称”,因此这里无需为变量提供“名称”。

你说:

我尝试了例如 field[0] OR field[1] 等,但这不起作用。

那么你做错了什么,但没有告诉我们什么。请详细说明“不起作用”的含义,包括向我们展示您如何尝试使用 field[0]field[1] 以及您可能会遇到哪些错误或异常,我们将为您提供更多信息完整的答案。

我猜你有一个范围问题,也许你的数组是在一个方法或构造函数块中声明的,或者其他一些循环或控制结构块使它在你试图使用它的地方不可见,但我不能确定。更多代码将帮助我们告诉您更多关于这方面的信息。


编辑
例如:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class TextFieldFun extends JPanel {
   public static final int TEXT_FIELD_COUNT = 8;
   private static final int COLS = 10;

   // array of JTextFields
   private JTextField[] fields = new JTextField[TEXT_FIELD_COUNT];

   // JTextField used to enter text to go into one of the array item fields
   private JTextField enterField = new JTextField(COLS);

   // spinner to choose which fields item to have its text set
   private JSpinner fieldIndexSpinner = new JSpinner(new SpinnerNumberModel(0, 0, TEXT_FIELD_COUNT - 1, 1));

   public TextFieldFun() {
      // JPanel to hold the array of fields
      JPanel textFieldPanel = new JPanel(new GridLayout(0, 1));
      for (int i = 0; i < fields.length; i++) {
         // create field items for array
         fields[i] = new JTextField(COLS);
         fields[i].setEditable(false);
         fields[i].setFocusable(false);
         JPanel rowPanel = new JPanel();
         rowPanel.add(new JLabel("Field " + i + ":"));
         rowPanel.add(fields[i]); // and put into a JPanel
         textFieldPanel.add(rowPanel);  // put JPanel into grid layout using JPanel
      }

      EnterAction enterAction = new EnterAction();
      enterField.setAction(enterAction);

      JPanel bottomPanel = new JPanel();
      bottomPanel.add(new JLabel("Row to Change:"));
      bottomPanel.add(fieldIndexSpinner);
      bottomPanel.add(new JLabel("Text:"));
      bottomPanel.add(enterField);
      bottomPanel.add(new JButton(enterAction));

      setLayout(new BorderLayout());
      add(textFieldPanel, BorderLayout.CENTER);
      add(bottomPanel, BorderLayout.SOUTH);
   }

   private class EnterAction extends AbstractAction {
      public EnterAction() {
         super("Enter");
      }
      @Override
      public void actionPerformed(ActionEvent e) {
         // get the text from the enterField JTextField
         String text = enterField.getText();

         // get the int from the JSpinner
         int index = ((Integer)fieldIndexSpinner.getValue()).intValue();

         // set the JTextField in the array whose index matches that of the spinner value
         fields[index].setText(text);
      }
   }

   private static void createAndShowGui() {
      TextFieldFun mainPanel = new TextFieldFun();

      JFrame frame = new JFrame("TextFieldFun");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

【讨论】:

  • 这是一个很棒的见解。在数组中,元素的“名称”是它的索引。
  • 我的意思是,我在上面创建的那个 for 循环中,我添加了一个 this 语句 field[0].setText("Hi"),它做得很好。但是当我将 [0] 更改为 [1] 或其他内容时,它确实添加了文本,而是更改了文本字段的大小。我很抱歉没有清楚地解释自己。谢谢。
  • @user3325350:请编辑您的问题并显示您正在使用的特定代码。尝试显示整个循环,尝试显示真实的代码,而不是某种代码(就像您最初的问题一样 - ?JFields??),尝试更详细地描述您的程序的不当行为,因为您在上面描述的内容, 调用 someTextField.setText("foo") 来改变字段的大小是不可能的。
【解决方案2】:

如果您坚持按名称引用它们,请使用 HashMap。

HashMap<String, JField> fieldNameMap = new HashMap<String, JField>();

fieldNameMap.put("field1", field[j]);
//repeat ad nauseum

//when you want to retrieve one
JField myField = fieldNameMap.get("field1");

【讨论】:

    【解决方案3】:

    您的要求实际上没有意义,除非您尝试使用每个单独的 Field 实例独立于在数组中引用它。上面推荐的 Map 解决方案可以工作,就像单独实例化每个 Field 并将其分配给一个变量一样。

    JField field1 = new JField();
    JField field2 = new JField();
    JField field3 = new JField();
    JField field4 = new JField();
    JField field5 = new JField();
    JFields[] fields = { field1, field2, field3, field4, field5 };
    // The following 2 statements reference the same JField instance.
    System.out.println( field5.toString() );
    System.out.println( fields[ 4 ].toString() );
    

    Map 对我来说更有意义,但是 null 检查步骤是一件很麻烦的事情(我想您也应该对数组解决方案进行 null 检查...我将把它留给读者)。

    Map<String,JField> fields = new HashMap<String,JField>();
    for( int i = 0; i < 5; i++ ) {
        String key = "field" + ( i + 1 );
        JField value = new JField();
        fields.put( key, value );
    }
    JField field = fields.get( "field5" );
    if ( field != null ) {
        System.out.println( field.toString() );
    }
    

    【讨论】:

      【解决方案4】:

      数组旨在使用索引(即fields[0], fields[1] 等)进行访问。

      如果您确实需要您的结构能够通过名称访问您的项目,那么您需要将数据结构从数组更改为映射。我建议使用 HashMap。

      您可以像这样将数组导入 HashMap:

      HashMap<String,JField> map = new HashMap<String,JField>();
      for (int i = 0; i < field.length; i++ ){
          map.put("field"+i ,field[i]);
      }
      

      现在您可以按名称访问您的 JField:

      map.get("field1")
      

      【讨论】:

        【解决方案5】:

        你不能明确地给数组命名。你要找的是Map

        【讨论】:

          【解决方案6】:

          您需要的是Map。它允许通过键查找值。在您的情况下,键是“名称”,值是整数。

          【讨论】:

            猜你喜欢
            • 2021-07-21
            • 2022-08-19
            • 1970-01-01
            • 1970-01-01
            • 2016-01-09
            • 2013-09-04
            • 1970-01-01
            • 1970-01-01
            • 2014-11-23
            相关资源
            最近更新 更多