如何通过用户输入显示JOptionPane

时间:2016-12-02 18:39:49

标签: java arrays oop joptionpane

我目前一直在努力弄清楚为什么我的数组值不会在对话框中进行双击。我正在完成一项任务,其详细信息如下:

"编写一个名为TallestBuildingLookupt的程序,其中包含10个TallestBuildingobjects的数组,并相应地填充上面给出的数据。然后使用对话框接受建筑物名称并显示建筑物的位置,高度和故事。如果未找到匹配项,则显示包含无效名称的错误消息,并允许用户搜索新的建筑物名称。"

我的主要问题是从我的toString()方法中显示我的数组值,并在我没有在数组中收到名称时处理异常。具体来说,让对话框循环以重新输入名称值并重新检查数组。任何帮助将不胜感激。

import javax.swing.*;

public class TallestBuildingLookup {

    static class TallestBuilding{
        private String name;
        private String city;
        private int height;
        private int stories;

        public TallestBuilding(String name, String city, int height, int stories)     {
            this.name = name;
            this.city = city;
            this.height = height;
            this.stories = stories; 
        }

        public String getName(){
            return this.name;
        }
        public String toString(){
            return  this.name + " of " + this.city + ", "+ this.stories + "stories/" + this.height + " feet high." ;    
        }
    }
    public static void main(String[] args){
        TallestBuilding[] tallestbuilding = new TallestBuilding[10];
        tallestbuilding[0] = new TallestBuilding("One World Trade Center", "New York", 1776, 104);
        tallestbuilding[1] = new TallestBuilding("Willis Tower", "Chicago", 1451, 108);
        tallestbuilding[2] = new TallestBuilding("Empire State", "New York", 1250, 102);
        tallestbuilding[3] = new TallestBuilding("Bank of America Tower", "New York", 1200, 55);
        tallestbuilding[4] = new TallestBuilding("Aon Center", "Chicago", 1136, 83 );
        tallestbuilding[5] = new TallestBuilding("John Hancock Center", "Chicago", 1127, 100);
        tallestbuilding[6] = new TallestBuilding("Wells Fargo Plaza", "Houston", 992,71 );
        tallestbuilding[7] = new TallestBuilding("Comcast Center", "Philidelphia", 974, 57 );
        tallestbuilding[8] = new TallestBuilding("Columbia Center", "Seattle", 967, 76);
        tallestbuilding[9] = new TallestBuilding("Key Tower", "Clevland", 947, 57);

        String entry = JOptionPane.showInputDialog("Enter a builing name");
        String name = (String) entry;

        System.out.println(name);

        for (int i=0; i<10; i++){
            if(name == tallestbuilding[i].getName() ){
                JOptionPane.showInputDialog(null, tallestbuilding[i] );
            }
            else{
                JOptionPane.showInputDialog("Sorry - no "+ name + " was found.");
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

试试这个:

TallestBuilding tallestBuilding = null;
for (int i=0; i<10; i++){
    if(name.equals(tallestbuilding[i].getName())){
       tallestBuilding = tallestbuilding[i];
       break;
    }
}
if(tallestBuilding == null) {
    JOptionPane.showInputDialog("Sorry - no "+ name + " was found.");
} else {
    JOptionPane.showMessageDialog(null, tallestBuilding);
}
  1. 不要使用&#39; ==&#39;比较字符串,因为它比较了一个引用,而不是它自己的值。查看Java String.equals versus ==
  2. 使用MessageDialog向用户显示值,而不是InputDialog
  3. 您应该在显示用户
  4. 后中断 for循环
  5. 您应该保存在临时参考中找到的对象,以便在之后显示它。

答案 1 :(得分:0)

  

具体来说,让对话框循环以重新输入名称值并重新检查数组。

好吧,你需要在某种类型的循环中输入,这是你在代码中没有做的事情。有两种主要的循环风格 - 一个 for loop ,当你事先知道你希望循环多少次(这里你没有), - 和一个时使用如果您事先不知道,请循环执行循环。我建议您使用 do-while 循环,因为您希望至少从用户那里获得一次输入,这意味着循环必须至少运行一次(如果不是更多),然后保持循环直到输入已验证。我会使用一个布尔值,比如称为boolean inputValid = false;

其他问题:你的for循环被破坏了。您对 循环中的匹配与不匹配 做出反应,这是不正确的,因为如果您这样做,您将为每个用户提供一个错误对话框不匹配,这不是你想要的。相反,你想检查循环中的匹配,如果找到匹配则设置一个布尔值,也许使用我上面提到的那个,然后在循环完成后,如果没有找到匹配则显示错误消息,然后重复我提到的do-while循环。

  

我的主要问题是从我的toString()方法中显示我的数组值,并在数组中没有收到名称时处理异常。

如果您在此问题上需要特定帮助,则需要告诉我们有关您显示的数据有什么问题的更多信息。