Eric Lang
Eric Lang

Reputation: 274

How to refresh JList without ListModel

I would use a listmodel but I've yet to find a way to easily add components from my ListArray into the listmodel. Is there a way that when the add button is pressed (adding an element into the JList) it would refresh the JList in addition to adding the String to the text file (Like I have set up).

Thanks for your help.

package movieinfo;

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import org.apache.commons.io.FileUtils;

import com.json.parsers.JSONParser;
import com.json.parsers.JsonParserFactory;

public class Swinggui {
    private static JButton enter;
    private static JTextField movietext;
    private static JTextArea movieinfo;
    private static JList listofmovies;// converts moviestowatch into gui
                                        // element.
    private static File textfilemovie; // file which movies marked for watching
                                        // are saved
    private static java.util.List<String> moviestowatch; // arraylist which is
                                                            // populated by
                                                            // textfilemovie
                                                            // than printed to
                                                            // GUI element
    private static JsonParserFactory factory;
    private static JSONParser parser;
    @SuppressWarnings("rawtypes")
    private static Map jsonData;
    private static ListSelectionListener setSearch;
    private static JButton add;

    public static void main(String[] args) throws IOException {
        yourMovies();
        gui();
        jsonAndButtons();

    }

    public static void gui() {
        JFrame maingui = new JFrame("Gui");
        maingui.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.VERTICAL;
        enter = new JButton("Get Info");
        c.gridx = 2;
        c.gridy = 1;
        maingui.add(enter, c);
        add = new JButton("add");
        c.gridx = 5;
        c.gridy = 6;
        maingui.add(add, c);
        movieinfo = new JTextArea(5, 20);
        movieinfo.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2,
                Color.red));
        movietext = new JTextField(18);
        c.gridx = 1;
        c.gridy = 1;
        maingui.add(movietext, c);
        final JScrollPane scrolll = new JScrollPane(movieinfo);
        c.gridx = 1;
        c.gridy = 3;
        c.gridwidth = 2;
        maingui.add(scrolll, c);
        final JLabel titlee = new JLabel("Enter movie name below!");
        c.gridx = 1;
        c.gridy = 0;
        maingui.add(titlee, c);
        final JLabel info = new JLabel("Info");
        c.gridx = 1;
        c.gridy = 3;
        maingui.add(titlee, c);
        final JLabel watchlist = new JLabel("Watchlist");
        c.gridx = 5;
        c.gridy = 1;
        maingui.add(watchlist, c);
        maingui.setResizable(false);
        maingui.setVisible(true);
        listofmovies = new JList(moviestowatch.toArray());
        c.gridx = 4;
        c.gridy = 3;
        maingui.add(new JScrollPane(listofmovies), c);
        movieinfo.setLineWrap(true);
        movieinfo.setWrapStyleWord(true);
        movieinfo.setEditable(false);
        scrolll.getPreferredSize();
        listofmovies.addListSelectionListener(setSearch);
        maingui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        maingui.pack();

    }

    public static void jsonAndButtons() {
        enter.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                System.out.println(apicall.getMovieInfo(movietext.getText().replaceAll(" ", "%20")));
                factory = JsonParserFactory.getInstance();
                parser = factory.newJsonParser();
                jsonData = parser.parseJson(apicall.getMovieInfo(movietext
                        .getText().replaceAll(" ", "%20")));
                String Title = (String) jsonData.get("Title");
                String Year = (String) jsonData.get("Year");
                String Plot = (String) jsonData.get("Plot");
                movieinfo.setText("Title: " + Title + "\nYear: " + Year
                        + "\nPlot: " + Plot);

            }

        });
        add.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent arg0) {
                try {
                    FileUtils.writeStringToFile( new File(
                            org.apache.commons.io.FileUtils.getUserDirectory()
                            + "/yourmovies.txt"), "\n" + movietext.getText(), true);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }  
                try {
                    moviestowatch = FileUtils.readLines(textfilemovie);
                    listofmovies = new JList(moviestowatch.toArray());

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

        }); 

    }

    public static void yourMovies() throws IOException {
        textfilemovie = new File(
                org.apache.commons.io.FileUtils.getUserDirectory()
                        + "/yourmovies.txt");
        textfilemovie.createNewFile();
        moviestowatch = FileUtils.readLines(textfilemovie);
        setSearch = new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent arg0) {
                factory = JsonParserFactory.getInstance();
                parser = factory.newJsonParser();
                jsonData = parser.parseJson(apicall.getMovieInfo(((String) listofmovies
                        .getSelectedValue()).replaceAll(" ", "%20")));
                String Title = (String) jsonData.get("Title");
                String Year = (String) jsonData.get("Year");
                String Plot = (String) jsonData.get("Plot");
                movieinfo.setText("Title: " + Title + "\nYear: " + Year
                        + "\nPlot: " + Plot);
            }
        };
    }
}

Upvotes: 1

Views: 1241

Answers (1)

mKorbel
mKorbel

Reputation: 109823

  1. read Oracle tutorial How to use List - Creating a Model for working code example

  2. create DefaultListModel as local variable, then every changes will be made only in the model

  3. there is bug, maybe feature, Swing GUI freeze for a few seconds, in the case that is removed more than 999 Items in one moment (already visible JList), can't found answer for this issue

  4. all updates to the already visible Swing GUI must be done on EDT, more read in Oracle tutorial Concurency in Swing - Event DIspatch Thread

  5. listofmovies = new JList(moviestowatch.toArray()); is short_cut in JList API, this constructor creating DefaultTableModel, any further changes to this array never will be accessed JList or DefaultListModel

Upvotes: 2

Related Questions