我目前有一个工作的GUI程序,上面有几个按钮,只需单步执行我的arraylist项目。这些只显示第一个,最后一个或下一个和上一个索引结果。此列表中包含String
,int
和double
。现在我添加了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
}
}
我还想了解上述链接的基准部分的含义。
答案 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)字段才能使其正常工作。
提高代码质量的一些提示:
InventoryItem
和OfficeSupplyItem
类分隔为不同的文件JavaGUIFixed
类,并将其所有组件定义为字段而不是局部变量,因为除了实际创建JFrame的makeWindow()
方法之外的其他各种方法中使用它们1} LI>
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。