我正在尝试创建一个Book Database GUI,它在创建的数组中插入每本书的标题,作者和价格。 有一个搜索功能,可以按标题搜索数据库中的特定书籍。 但是我的代码似乎只适用于一本书,而不适用于多本书。 我想在这里输入10本书的详细信息。 我只能搜索最后创建的书。
我的代码如下:
class Book{
public String title,author;
public int price;
Book(String t,String a,int p){
this.title=t;
this.author=a;
this.price=p;
}
}
class Swingdemo implements ActionListener{
Book B[]=new Book[10];
JLabel jl1;
JTextField a1,a2,a3,a4;
JButton j1,j2,j3;
Swingdemo() {
JFrame jfrm = new JFrame("Welcome");
jfrm.setSize(180,300);
jfrm.setLayout(new FlowLayout());
jfrm.setDefaultCloseOperation(jfrm.EXIT_ON_CLOSE);
a1 = new JTextField(8);
a2 = new JTextField(8);
a3 = new JTextField(8);
j1 = new JButton("Create");
a4 = new JTextField(8);
j2 = new JButton("Search");
jl1 = new JLabel("Press a Button");
j1.setActionCommand("1");
j2.setActionCommand("2");
j1.addActionListener(this);
j2.addActionListener(this);
jfrm.add(a1);
jfrm.add(a2);
jfrm.add(a3);
jfrm.add(j1);
jfrm.add(a4);
jfrm.add(j2);
jfrm.add(jl1);
jfrm.setVisible(true);
}
int num=0;
public void actionPerformed(ActionEvent ae){
if(ae.getActionCommand().equals("1")){
B[num]=new Book(a1.getText(),a2.getText(),Integer.parseInt(a3.getText()));
jl1.setText("Book has been added");
num++;
}
else{
int i;
for(i=0;i<B.length;i++){
if(B[i].title.equals(a4.getText()))
jl1.setText("Book has been found");
}
if(i==B.length)
jl1.setText("Book was not found");
}
}
public static void main(String []args){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
new Swingdemo();
}
});
}
}
答案 0 :(得分:1)
我更喜欢使用Optional包装而不是找到的
这样的局部变量Optional<Book> mbyBook = Optional.empty();
for (Book b : B) {
if (b.title.equals(a4.getText())) {
mbyBook = Optional.of(b);
break;
}
}
if (mbyBook.isPresent()) {
jl1.setText(String.format("Book has been found %s", mbyBook));
} else {
jl1.setText("Book was not found");
}
答案 1 :(得分:1)
解决这样的问题的方法是将它与所有不相关的Swing东西分开,变成一个自己的方法:
public String findBook(String title) {
int i;
for(i=0;i<B.length;i++){
if(B[i].title.equals(title))
return("Book has been found");
}
if(i==B.length)
return("Book was not found");
}
}
我在这里所做的就是从int i
开始复制/粘贴您的代码,并将其放在方法中,传递title
而不是直接查看Swing文本字段。然后我用setText
替换了return
s。
您可以通过将主代码中的整个块替换为:
来调用此方法 jl1.setText(findBook(a4.getText());
现在该方法独立于Swing,您可以自行测试。
第一个问题是它不会编译。现在我们已经使用setText
返回了return
,编译器可以注意到,通过代码的路径并没有返回任何内容 - 其中所有if
1}} s是假的。
所以让我们通过在最后添加一个返回来编译它。我们还会添加大括号{}
,以便if
在视觉上保持一致。永远不要遗漏大括号,即使编译器允许你。
public String findBook(String title) {
for(int i=0;i<books.length;i++){
if(books[i].title.equals(title))
return("Book has been found");
}
if(i==books.length) {
return("Book was not found");
}
}
return null;
}
我还将i
的声明移到了初始化中。这是一种熟悉的形式。
我将B
重命名为books
。在Java中,我们倾向于描述变量名,变量总是以小写字母开头。
现在我们有一些可以编译的东西。一个好方法是在调试器中运行测试(您的IDE有一个)。但我们可以关注这些代码,并弄清楚当找不到这本书时会做些什么。
我们说B[]
只有3个项目。 i
从0开始。
0 < 3
?是。继续循环。B[0]
是否与标题相符?否。跳过if。0 == 3
吗?否。跳过if。i++
- i == 1
1 < 3
?是。继续循环。B[1]
是否与标题相符?否。跳过if。1 == 3
吗?否。跳过if。i++
- i == 2
2 < 3
?是。继续循环。 B[2]
是否与标题相符?否。跳过if。2 == 3
吗?否。跳过if。i++
- i == 3
3 < 3
?不。退出循环。我们从未通过if(i==B.length)
测试,因为我们只在i<B.length
时输入该块。
但return null
被击中了。所以你可以通过在循环后放置not found
响应来让它做你想做的事情:
public String findBook(String title) {
for(int i=0;i<Books.length;i++){
if(Books[i].title.equals(title))
return("Book has been found");
}
}
return("Book was not found");
}
答案 2 :(得分:0)
boolean found = false;
for(i=0;i<B.length;i++) {
if(B[i].title.equalsIgnoreCase(a4.getText().trim())) {
found = true;
break;
}
}
if(!found)
jl1.setText("Book was not found");
else
jl1.setText("Book has been found");
或者你也可以这样做,
for(i=0;i<B.length;i++) {
if(B[i].title.equalsIgnoreCase(a4.getText().trim())) {
break;
}
}
if(B.length > 0 && i < B.length)
jl1.setText("Book has been found");
else
jl1.setText("Book was not found");