Multithreading 多线程和JList

Multithreading 多线程和JList,multithreading,jlist,Multithreading,Jlist,我不断得到索引越界错误,Eclipse并没有告诉我为什么或者我的代码的哪一行导致了这种情况!这是一个多线程任务,我的代码在某种程度上可以工作。我们将让一个线程从用户提供的目录中查找所有文件,当用户单击JList中的文件并将所选文本文件中的文本写入右侧的文本区域时,将使用另一个线程。但主要问题是,JList在单击搜索按钮后有时显示,有时不显示,还有索引越界异常 import java.awt.BorderLayout; import java.awt.Dimension; import java

我不断得到索引越界错误,Eclipse并没有告诉我为什么或者我的代码的哪一行导致了这种情况!这是一个多线程任务,我的代码在某种程度上可以工作。我们将让一个线程从用户提供的目录中查找所有文件,当用户单击JList中的文件并将所选文本文件中的文本写入右侧的文本区域时,将使用另一个线程。但主要问题是,JList在单击搜索按钮后有时显示,有时不显示,还有索引越界异常

 import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;



public class Atlas
{
    JList<String> list;

    DefaultListModel<String> model;



    private JFrame frame;
    private JLabel lblDirectory;
    private JTextField inputDirectory;
    private JLabel lblExtension;
    private JTextField inputExtension;
    private JButton btnSearch;

    private Scanner reader;
    private JPanel southPanel;
    private JScrollPane pane;

    private JTextArea text;


    public static void main(String[] args)
    {
        Atlas p = new Atlas();
        p.go();
    }

    public void go()
    {
        frame = new JFrame();
        frame.setSize(984, 503);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        model = new DefaultListModel<String>();
        list = new JList<String>();


        pane = new JScrollPane(list);
        pane.setPreferredSize(new Dimension(270,300));

        frame.add(pane, BorderLayout.WEST);




        lblDirectory = new JLabel("Start Directory:");
        inputDirectory = new JTextField();
        lblExtension = new JLabel("File Extension:");
        inputExtension = new JTextField();
        btnSearch = new JButton("Search");





        lblDirectory.setSize(64, 20);
        inputDirectory.setPreferredSize(new Dimension(200, 20));
        lblExtension.setSize(64, 20);
        inputExtension.setPreferredSize(new Dimension(200,20));

        btnSearch.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                Thread myThread = new Finder();
                myThread.start();

               // listFiles(inputDirectory.getText());
            }
        });



        //Text Area
        text = new JTextArea(200,32);
        JScrollPane textPane = new JScrollPane();
        textPane.setPreferredSize(new Dimension(270,300));
        textPane.add(text);
        frame.add(text, BorderLayout.CENTER);



        Thread myThread2 = new Counter2();
        myThread2.start();



        southPanel = new JPanel();

        //Making bottom visible
        southPanel.add(lblDirectory);
        southPanel.add(inputDirectory);
        southPanel.add(lblExtension);
        southPanel.add(inputExtension);
        southPanel.add(btnSearch);
        frame.add(southPanel, BorderLayout.SOUTH);

        // show the window
        frame.setVisible(true);
    }

    class Finder extends Thread
    {
        public int count = 0;

        @Override
        public void run()
        {
            //while(true)
            {

                listFiles(inputDirectory.getText());









                System.out.println("a: " + count);

            }
        }
    }





     public void listFiles(String path)
        {
            File root = new File(path);
            File[] listOfFiles = root.listFiles();

            if(listOfFiles == null) return;

            for(File f: listOfFiles)
            {
                if(f.isDirectory())
                {
                    listFiles(f.getAbsolutePath());
                    //JTextField button = new JTextField(f.getAbsoluteFile().toString());
                    //listFiles.add(button);
                    model.addElement(f.getAbsoluteFile().toString());
                    list.setModel(model);
                    System.out.println("Dir: " + f.getAbsoluteFile().toString());
                    //crap.addElement(f.getAbsoluteFile().toString());
                }

                else
                {
                    System.out.println("Dir: " + f.getAbsoluteFile());
                    model.addElement(f.getAbsoluteFile().toString());
                }
            }



        }


    class Counter2 extends Thread
    {

        int count = 0;
        @Override
        public void run()
        {
            //while(true)
            {
                list.addListSelectionListener(new ListSelectionListener()
                {
                    public void valueChanged(ListSelectionEvent event)
                    {
                        try
                        {
                            File file = new File(list.getSelectedValue());
                            System.out.println(list.getSelectedValue());
                            System.out.println("hi");
                            reader = new Scanner(file);
                            while(reader.hasNextLine())
                            {
                                text.append(reader.nextLine());
                                text.append("\n");
                            }
                        } catch (FileNotFoundException e1) 
                        {
                            JOptionPane.showMessageDialog(frame, "Error Connecting To File");
                        }


                    }
                });

                System.out.println("b: " + count);


            }
        }
    }
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.Scanner;
导入javax.swing.DefaultListModel;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
导入javax.swing.JTextField;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
公共类地图集
{
JList列表;
默认列表模型;
私有JFrame;
私人JLabel-lbl目录;
私有JTextField输入目录;
私人JLabel;
私有JTextField输入扩展;
私人JButton btnSearch;
私人扫描仪阅读器;
私人JPanel southPanel;
私有JScrollPane;
私有区域文本;
公共静态void main(字符串[]args)
{
Atlas p=新Atlas();
p、 go();
}
公开作废go()
{
frame=新的JFrame();
框架设置尺寸(984503);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
model=新的DefaultListModel();
列表=新JList();
窗格=新的JScrollPane(列表);
窗格。设置首选尺寸(新尺寸(270300));
框架。添加(窗格,边框布局。西);
lblDirectory=newjlabel(“开始目录:”);
inputDirectory=new JTextField();
lblExtension=newjlabel(“文件扩展名:”);
inputExtension=新的JTextField();
btnSearch=newjbutton(“搜索”);
lblDirectory.setSize(64,20);
setPreferredSize(新维度(200,20));
lblExtension.setize(64,20);
setPreferredSize(新维度(200,20));
addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
线程myThread=newfinder();
myThread.start();
//listFiles(inputDirectory.getText());
}
});
//文本区
text=新的JTextArea(200,32);
JScrollPane textPane=新的JScrollPane();
textPane.setPreferredSize(新维度(270300));
textPane.add(文本);
添加(文本、边框布局、中心);
线程myThread2=新计数器2();
myThread2.start();
southPanel=newjpanel();
//使底部可见
添加(LBL目录);
添加(输入目录);
southPanel.add(lblExtension);
添加(输入扩展名);
添加(btnSearch);
添加框架(southPanel,BorderLayout.SOUTH);
//显示窗口
frame.setVisible(true);
}
类查找器扩展线程
{
公共整数计数=0;
@凌驾
公开募捐
{
//while(true)
{
listFiles(inputDirectory.getText());
系统输出打印项次(“a:+计数);
}
}
}
公共无效列表文件(字符串路径)
{
文件根=新文件(路径);
File[]listOfFiles=root.listFiles();
if(listOfFiles==null)返回;
对于(文件f:listOfFiles)
{
if(f.isDirectory())
{
列表文件(f.getAbsolutePath());
//JTextField按钮=新的JTextField(f.getAbsoluteFile().toString());
//添加(按钮);
model.addElement(f.getAbsoluteFile().toString());
list.setModel(model);
System.out.println(“Dir:+f.getAbsoluteFile().toString());
//crap.addElement(f.getAbsoluteFile().toString());
}
其他的
{
System.out.println(“Dir:+f.getAbsoluteFile());
model.addElement(f.getAbsoluteFile().toString());
}
}
}
类计数器2扩展线程
{
整数计数=0;
@凌驾
公开募捐
{
//while(true)
{
addListSelectionListener(新的ListSelectionListener()
{
public void值已更改(ListSelectionEvent事件)
{
尝试
{
File File=新文件(list.getSelectedValue());
System.out.println(list.getSelectedValue());
System.out.println(“hi”);
读卡器=新扫描仪(文件);
while(reader.hasNextLine())
{
text.append(reader.nextLine());
text.append(“\n”);
}
}捕获(FileNotFoundException e1)
{
showMessageDialog(框架,“连接到文件时出错”);
}
}
});
系统输出打印项次(“b:+计数);
}
}
}
}
Th