如何使用JTextField和JButton搜索包含字符串,int和double的arraylist

时间:2013-12-04 03:48:42

标签: java search user-interface netbeans arraylist

我目前有一个工作的GUI程序,上面有几个按钮,只需单步执行我的arraylist项目。这些只显示第一个,最后一个或下一个和上一个索引结果。此列表中包含Stringintdouble。现在我添加了JTextField输入和搜索按钮。我的问题是如何让我的搜索按钮搜索这个数组列表?我正在阅读this answer,但我不了解基准的事情。在搜索之前,我是否必须将整个arraylist转换为字符串?会像

    ArrayList<inventoryItem> inventory = new ArrayList<>();  ....    
    JTextField input = new JTextField(18); ...
          JButton searchButton = new JButton("Search");
            searchButton.setToolTipText("Search for entry");


searchButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                String usrInput = input.getText();
                for (String s : inventory) {
                    if (usrInput.contains(s)) {
                        inventory.get(currentIndex);
                        outputText.append(" somehow put whatever the index is equal to here");

                    }

                }

            }
        });

我得到的错误是inventoryItem cannot be converted to string。第二个问题:我所拥有的是如何让它输出该索引中的所有内容。例如,我的输出如下所示:

class officeSupplyItem extends inventoryItem {

    public officeSupplyItem(String itemName, int itemNumber, int inStock, double unitPrice) {
        super(itemName, itemNumber, inStock, unitPrice);
    }

    @Override
    public void output(JTextArea outputText) {
        outputText.setText("Item Name = " + itemName + " \n"); //print out the item name
        outputText.append("Item Number = " + itemNumber + " \n"); //print out the item number
        outputText.append("In Stock = " + inStock + " \n"); //print out how many of the item are in stock
        outputText.append("Item Price = $" + formatted.format(unitPrice) + " \n"); //print out the price per item
        outputText.append("Restocking fee is $" + formatted.format(restockingFee) + " per item \n");
        outputText.append("Value of item inventory = $" + formatted.format(value) + " \n"); //print out the value of the item inventory
        outputText.append("Cost of inventory w/restocking fee = $" + formatted.format(inventoryValue) + " \n"); //print out the total cost of inventory with restocking fee

    }
}

我还想了解上述链接的基准部分的含义。

4 个答案:

答案 0 :(得分:2)

我不清楚你的意思是“这个列表里面有String,int和double”。

您正在将对象字段与输入的文本进行比较。您无需将InventoryItem转换为字符串。您需要做的是确定要比较的字段,并在比较中使用它们。

从我看到的文本输入到JTextField是您的代码的搜索条件。如果我认为它是itemName,那么您的代码应如下所示:

searchButton.addActionListener(new ActionListener() {  
       @Override  
        public void actionPerformed(ActionEvent ae) {
            String usrInput = input.getText();
            for (InventoryItem s : inventory) {
                if (usrInput.equalsIgnoreCase(s.getItemName())) {
                    //you can call output string here
                    outputText.append(" somehow put whatever the index is equal to here");

                }
            }

        }
    });

这适用于JTextField输入是itemName的情况。如果这与您预期的有任何不同,请发表评论。

从您分享的链接,不同之处在于他的List仅包含字符串,这就是“datum”是String的原因。这不能用于您的情况。

希望这有帮助!

答案 1 :(得分:1)

你的增强for循环是对ArrayList库存中的每个String元素说的...但是库存被声明为inventoryItem对象的ArrayList,而不是字符串列表,并且for循环不访问变量所在的变量存储您尝试搜索的值,因为每个库存索引只是存储对象的引用。

如果您的主要目标是输入,存储,排序和输出,您可以考虑将其作为字符串集合中的字符串进行存储。如果需要,您可以随时解析为int或double,但使用同类数据类型进行排序和搜索会更容易。

我看到该链接中使用的数据就像变量名一样,就像在代码中使用's'一样。

答案 2 :(得分:1)

根据我的理解,应该列出searchText(itemName或itemNumber)的结果。因此,您可以编写一个搜索方法来比较并返回它是否与InventoryItem类中的搜索字符串匹配。

public boolean isSearchTextAvailable(String searchText) {
    if (this.itemName.equals(searchText)) {
        return true;
    } else {
        try {
            int no = Integer.parseInt(searchText);
            if (this.itemNumber == no) {
                return true;
            }
        } catch (NumberFormatException e) {
            System.out.println("Not a integer");
        }
    }
    return false;
}

您可以将此方法增强到您想要在其中搜索的任意数量的字段。

然后在searchButton的操作中使用此方法。

  searchButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {

            String usrInput = input.getText();

            for (InventoryItem invItem : inventory) {
                if (invItem.isSearchTextAvailable(usrInput)) {
                    invItem.output(outputText);
                }
            }

        }
    });

您必须在此类中输入(JTextField)字段才能使其正常工作。

提高代码质量的一些提示:

  • InventoryItemOfficeSupplyItem类分隔为不同的文件
  • 请注意,类名的命名约定是PascalCase
  • 最好从JFrame扩展JavaGUIFixed类,并将其所有组件定义为字段而不是局部变量,因为除了实际创建JFrame的makeWindow()方法之外的其他各种方法中使用它们
  • 不要使用invItem.output(outputText)类型的方法,将JTextField传递给对象的方法写入它。您可以做的是在InventoryItem类中编写类似getOutputString()的方法,它将返回需要打印的格式化字符串,然后调用outputText.setText(invItem.getOutputString()) - 您的实现限制您将所有类都作为内部类到JavaGUIFixed。

希望这有帮助!

答案 3 :(得分:1)

我已将@maheeka的回复标记为答案。然而,由于我之前编写程序的方式,我不得不修改他的代码。现在看来如下:

searchButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            String usrInput = input.getText();
            for (int i = 0; i < inventory.size(); i++) {
                if (usrInput.equalsIgnoreCase(inventory.get(i).getItemName())) {
                    currentIndex = i;
                    displayItem(outputText);

我还必须在itemName上设置我的getter,因为我显然忘记了那一部分。谢谢@Aadi Droid。