Классы графического интерфейса (JTextField-JTextArea)

Я новичок в графическом интерфейсе и java, у меня возникла проблема с методом actionPerformed, когда я пытался написать код для этого вопроса:

  1. Используя макет кадра, показанный ниже, напишите программу, которая ищет фильм, название которого введено в текстовое поле. Когда пользователь нажимает кнопку SEARCH или клавишу ENTER, информация о фильме (название, год и жанр) отображается в текстовой области. Если фильм не найден, отобразите в текстовой области сообщение о том, что этот фильм не существует. Используйте массив для хранения информации о количестве фильмов.

Я был бы очень признателен, если бы кто-нибудь объяснил, как заставить этот код работать правильно.
Моя попытка:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class movie {
    public String title;
    public String year;
    public String genre;
    public movie(String t, String y, String g) {
        title = t;
        year = y;
        genre = g;
    }
    public String toString() {
        return "TITLE: " + title + "\nYEAR: " + year + "\nGENRE: " + genre;
    }
}

public class searchMovieFrame extends JFrame implements ActionListener {
    public movie m1 = new movie("Iron Man", "2008", "Action,Adventure");
    public movie m2 = new movie("Iron Man", "2010", "Action,Adventure");
    public movie m3 = new movie("Total Recall", "2012", "Action,Adventure");
    public movie[] movies = {
        m1, m2, m3
    };

    private static final int width = 300;
    private static final int height = 200;
    private static final int x = 360;
    private static final int y = 150;
    private JButton search;
    private JTextField input;
    private JTextArea output;
    private JLabel message;

    public searchMovieFrame() {
        Container contentPane = getContentPane();
        setSize(width, height);
        setResizable(false);
        setTitle("Search Movie Frame");
        setLocation(x, y);
        contentPane.setLayout(new FlowLayout(FlowLayout.LEFT));
        message = new JLabel();
        message.setText("Enter the movie title please");
        message.setSize(150, 25);
        contentPane.add(message);
        input = new JTextField();
        input.setColumns(15);
        contentPane.add(input);
        input.addActionListener(this);
        search = new JButton("Search");
        contentPane.add(search);
        search.addActionListener(this);
        output = new JTextArea();
        output.setColumns(23);
        output.setRows(5);
        output.setEditable(false);
        contentPane.add(output);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void actionPerformed(ActionEvent event) {
        for (int i = 0; i < 3; i++)
        if (input.getText().equals(movies[i].title)) output.setText(toString());
        else output.setText("THAT MOVIE IS NOT AVAILABLE");
    }

    public static void main(String[] args) {
        searchMovieFrame frame = new searchMovieFrame();
        frame.setVisible(true);
    }
}

person user2252700    schedule 06.04.2013    source источник


Ответы (1)


Вам нужно break, как только вы найдете нужный фильм.

Также используйте Movie#toString, а не toString представление текущего JFrame. Не ограничивайте поиск только первыми тремя фильмами, используйте movies.length в качестве верхней границы поиска. Для повышения эффективности любые обновления компонентов должны выполняться после обработки цикла.

Movie searchMovie = null;
for (int i = 0; i < movies.length; i++) {
   if (input.getText().equals(movies[i].title)) {
      searchMovie = movies[i];
      break;
   }
}

if (searchMovie == null) {
   output.setText("THAT MOVIE IS NOT AVAILABLE");
} else {
   output.setText(searchMovie.toString());
}

Кроме того: используйте соглашения об именах Java, чтобы различать такие классы, как Movie.

person Reimeus    schedule 06.04.2013