按下从File加载的JButton JList不会刷新

时间:2013-10-23 13:48:30

标签: java swing jbutton actionlistener jlist

当我触发按钮的actionlistener时,JList无法刷新。 我可以做的唯一一个让它刷新的方法是回忆一下GUI方法,这种效率并不高效,因为它只是打开了第二个窗口。 有没有人有任何建议让添加和删除按钮自动更新JList?

    package movieinfo;    
    import java.awt.Color;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Scanner;

    import javax.swing.BorderFactory;
    import javax.swing.DefaultListModel;
    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;
    public class Swinggui {
        public static void main(String[] args) throws IOException {
            new Swinggui();
        }

        public Swinggui() throws IOException {
            yourMovies();
            gui();
            Buttons();
        }

        JFrame maingui;
        JButton enter;
        JButton remove;
        public JTextField movietext;
        JList listofmovies;
        File textfilemovie;
        JScrollPane listscroll;
        ListSelectionListener setSearch;
        JButton add;
        JTextArea movieinfo;
        DefaultListModel lmodel;

        public void gui() throws IOException {
            maingui = new JFrame("Gui");
            maingui.setLayout(new GridBagLayout());
            GridBagConstraints c = new GridBagConstraints();
            c.fill = GridBagConstraints.VERTICAL;
            lmodel = new DefaultListModel();
            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);
            remove = new JButton("del");
            c.gridx = 6;
            c.gridy = 6;
            maingui.add(remove, 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);
            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);
            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(FileUtils.readLines(textfilemovie).toArray());
            listscroll = new JScrollPane(listofmovies);
            c.gridx = 4;
            c.gridy = 3;
            maingui.add(listscroll, c);
            movieinfo.setLineWrap(true);
            movieinfo.setWrapStyleWord(true);
            movieinfo.setEditable(false);
            scrolll.getPreferredSize();
            listofmovies.addListSelectionListener(setSearch);
            maingui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            maingui.pack();
        }

        public void Buttons() {
            enter.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {

                    System.out.println(apicall.getMovieInfo(movietext.getText()
                            .replaceAll(" ", "%20")));
                    movieinfo.setText(apicall.getMovieInfo(movietext.getText()
                            .replaceAll(" ", "%20")));
                }

            });
            add.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    try {
                        FileUtils.writeStringToFile(textfilemovie,
                                "\n" + movietext.getText(), true);
                        maingui.validate();
                        maingui.repaint();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }
            });
            remove.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent arg0) {
                    Scanner filescan = null;
                    File textfiletemp = new File(org.apache.commons.io.FileUtils
                            .getUserDirectory() + "/yourmoviestemp.txt");
                    try {
                        textfiletemp.createNewFile();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                    try {
                        filescan = new Scanner(textfilemovie);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                    while (filescan.hasNextLine()) {
                        String line = filescan.nextLine();
                        if (line != (String) listofmovies.getSelectedValue()) {
                            try {
                                FileUtils.writeStringToFile(textfiletemp, "\n"
                                        + line, true);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                    textfiletemp.renameTo(textfilemovie);
                    textfiletemp.delete();
                }

            });
        }

        public void yourMovies() throws IOException {
            textfilemovie = new File(
                    org.apache.commons.io.FileUtils.getUserDirectory()
                            + "/yourmovies.txt");
            textfilemovie.createNewFile();
            setSearch = new ListSelectionListener() {
                public void valueChanged(ListSelectionEvent arg0) {
                    movieinfo.setText(apicall.getMovieInfo(((String) listofmovies
                            .getSelectedValue()).replaceAll(" ", "%20")));
                }
            };
        }
    }

2 个答案:

答案 0 :(得分:2)

作为第一个提示:line != (String) listofmovies.getSelectedValue()不是比较字符串的合适方法。请始终使用String.equals()

!line.equals((String)listofmovies.getSelectedValue())
  

我能做的唯一方法就是回忆一下GUI   方法,这不是那么有效,因为字面意思只是打开一个   第二个窗口。

很抱歉,但我不知道这是什么意思。

  

有没有人有任何建议来制作添加和删除按钮   自动更新JList

只需使用列表模型在JList代码中添加/删除actionPerformed中的数据。您已经引用了lmodel DefaultListModel的实例。请查看DefaultListModel.addElement()DefaultListModel.removeElement()

How to Use Lists教程中对此进行了解释。

答案 1 :(得分:0)

  

当我尝试从FileUtils.readLines(textfilemovie).toArray()添加元素时,我得到一个空指针。

您尝试阅读的文件的名称是什么?

为什么你的代码结构仍然没有遵循Swing教程中的示例???需要多长时间才能被要求这样做?你的代码没有在EDT上执行,这会导致随机错误!

在提问时发布适当的SSCCE。我们无权访问您的FileUtils类。提出问题意味着您已经完成了一些基本的调试并将问题隔离开来,因此您创建了一个演示问题的SSCCE。我们不是她调试你的真实代码。

我厌倦了那些不断提问的人,却没有听从他们给出的任何建议。我们提出这个建议是有原因的。这是为了帮助你编写更好的程序,因为程序设计不佳,你不需要不断地寻求我们的帮助。