не могу создать JTextField - PullRequest
       1

не могу создать JTextField

0 голосов
/ 03 апреля 2011
import org.jsoup.Jsoup;


@SuppressWarnings({ "unused", "serial" })

public class SimpleWebCrawler extends JFrame  {

    JTextField yourInputField = new JTextField(20);
    static JTextArea _resultArea = new JTextArea(200, 200);
    JScrollPane scrollingArea = new JScrollPane(_resultArea);
    private final static String newline = "\n";
    String word2;


    public SimpleWebCrawler() throws MalformedURLException  {

        yourInputField.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            word2 = yourInputField.getText();
        }
        });


        _resultArea.setEditable(false);


        try {
            URL my_url = new URL("http://" + word2 + "/");
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    my_url.openStream()));
            String strTemp = "";
            while (null != (strTemp = br.readLine())) {
                _resultArea.append(strTemp + newline);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        _resultArea.append("\n");
        _resultArea.append("\n");
        _resultArea.append("\n");


        String url = "http://" + word2 + "/";
        print("Fetching %s...", url);

        try{
        Document doc = Jsoup.connect(url).get();
        Elements links = doc.select("a[href]");


        System.out.println("\n");

        BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\user\\fypworkspace\\FYP\\Link\\abc.txt"));
        _resultArea.append("\n");
        for (Element link : links) {
            print("  %s  ", link.attr("abs:href"), trim(link.text(), 35));

            bw.write(link.attr("abs:href"));
            bw.write(System.getProperty("line.separator"));
        }
        bw.flush();
        bw.close();
        } catch (IOException e1) {

        }
        JPanel content = new JPanel();

        content.setLayout(new BorderLayout());
        content.add(scrollingArea, BorderLayout.CENTER);
        content.add(yourInputField,BorderLayout.SOUTH);


        this.setContentPane(content);
        this.setTitle("Crawled Links");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        JPanel content2 = new JPanel();
        this.setContentPane(content2);
        this.setTitle("Input the URL");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();


        }

        private static void print(String msg, Object... args) {

            _resultArea.append(String.format(msg, args) +newline);
        }

        private static String trim(String s, int width) {
            if (s.length() > width)
                return s.substring(0, width - 1) + ".";
            else
                return s;
        }

        //.. Get the content pane, set layout, add to center




    public static void main(String[] args) throws IOException {

        JFrame win = new SimpleWebCrawler();
        win.setVisible(true);

    }

}

Я пытаюсь создать JTextField для приема ввода пользователя. Ввод будет идти к этой строке кода для обработки кода.

URL my_url = new URL("http://" + word2 + "/");

         String url = "http://" + word2 + "/";

Однако код запускается без запроса ввода данных пользователем. JTextField не появляется, и я сразу получаю сообщение об ошибке, потому что я не могу ввести ввод.

Я пытаюсь заставить JTextField принимать ввод от пользователя. Тем не менее, он не появляется, и код сразу приступает к обработке, заканчивающейся пустой переменной my_url и rmpty url.

Как мне создать JTextField в соответствии с моим кодом, который я публикую? Кажется, что созданное мной поле Jtext столкнулось с моими кодами.

1 Ответ

2 голосов
/ 03 апреля 2011

Java Swing не следует императивному подходу, а основан на событиях. Ваш метод конструктора выполнен в общей сложности и не ждет вашего ввода.

Вы не должны включать бизнес-логику (т. Е. Все эти материалы для чтения / записи) в этот метод, а в отдельный метод и вызывать его из прослушивателя действий, зарегистрированного в поле ввода. (см., например, http://download.oracle.com/javase/tutorial/uiswing/events/index.html)

Примечание A: Если ваша логика довольно тяжелая, вы должны создать фоновый поток, а не делать это непосредственно в слушателе действий (см. Swingworker ).

Примечание B: В вашем классе много странного кода.

this.setContentPane(content);
this.setTitle("Crawled Links");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
JPanel content2 = new JPanel();
this.setContentPane(content2);
this.setTitle("Input the URL");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();

Как упоминалось ранее, он будет запущен немедленно, и, таким образом, ваша панель content вообще не будет отображаться, потому что она будет перезаписана на content2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...