1

文字列 (Web ページから編集されたテキスト) を返すメソッドを呼び出しており、その文字列を JTextArea に出力したいと考えています。コマンドラインには正しく出力されますが、JTextArea には出力されないため、JTextArea に送信している文字列が正しいことはわかっています。それをTextAreaに追加する際に間違ったことをしているに違いありません。どんな助けでも大歓迎です。

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

public class BrowserPanel extends JPanel {

private JTextField textField;
private String urlText;
private JTextArea textArea;
private BrowserPageReader myModel;
private String pageContent;
private BrowserFrame myFrame;
private String pageTitle;
private String pageBody;



public BrowserPanel(JTextField myTextField, BrowserPageReader model,
        BrowserFrame frame)
{
    myFrame = frame;
    myModel = model;
    textField = myTextField;
    textField.addActionListener(new InputHandler());

    /*JScrollPane areaScrollPane = new JScrollPane(textArea);
    areaScrollPane.setVerticalScrollBarPolicy(
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    areaScrollPane.setPreferredSize(new Dimension(250,250));*/
    textArea = new JTextArea(20,40);
    textArea.setEditable(false);
    textArea.setWrapStyleWord(true);
    textArea.setLineWrap(true);
    JScrollPane scroll = new JScrollPane(textArea);

    add(scroll);
}

public void paintComponent(Graphics g)
{
    super.paintComponent(g);

}
private class InputHandler implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
         urlText = textField.getText();  
         //textArea.append(urlText);

         myModel.setURL(urlText);
         pageTitle = myModel.getTitle();
         myFrame.setTitle(pageTitle);
        pageBody = myModel.getBody();
        textArea.setText(pageBody); 
         System.out.println(pageBody); //This prints out exactly what Im wanting
                                       //  Its just a test             
         textArea.repaint();
    }
}
}

TextArea は Panel に接続されている scrollPane にあるため、paintComponent に何かを追加する必要があると思います。私は本当に何が間違っているのか理解できません。私が入れればtextArea.setText("blah");、それはすべきことをします。送信する変数は非常に大きな文字列で、Web ページ全体です。それが問題でしょうか?コードをそのまま使用すると、textArea は空白のままになり、表示したいものがコマンド ラインに正しく出力されます。ヘルプ!

ここで編集は私のコードの残りの部分です

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

public class BrowserFrame extends JFrame{

public BrowserFrame()
{
    BrowserPageReader myModel = new BrowserPageReader();
    setTitle("My Browser");
    Toolkit kit = Toolkit.getDefaultToolkit();
    Dimension screenSize =kit.getScreenSize();
    setSize(screenSize.width/2,screenSize.height-500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container contentPane = getContentPane();
    JTextField textField = new JTextField(20);
    BrowserPanel myPanel = new BrowserPanel(textField,myModel,this);
    contentPane.add(myPanel);
    contentPane.add(textField,BorderLayout.PAGE_START);
    setVisible(true);

}
}





 import javax.swing.*;
import java.io.*;
import java.net.*;

public class BrowserPageReader {

private URL myURL;
//private String webURL;
private String totalWebContent;
private String htmlString;
private String contentToPrint = " ";
private String urlPath;
private String urlHost;
private String pageTitle;
private String pageBody;
private String formattedBody;

public void setURL (String webURL)
{
   try{
        myURL = new URL(webURL);
        urlPath = myURL.getPath();
        urlHost = myURL.getHost();

    }
    catch(MalformedURLException e)
    {
        JOptionPane.showMessageDialog(null,"URL is incorrectly formatted");
    }
}

public void retrieveContent()
{
    try{
        Socket socket = new Socket(urlHost,80);
        PrintWriter out = new PrintWriter(socket.getOutputStream());
        BufferedReader in = new
                BufferedReader(new InputStreamReader(socket.getInputStream()));
        out.print("GET " + urlPath + " HTTP/1.1\n");
        out.print("Host: "+ urlHost + "\n");
        out.print("\n");
        out.flush();
        while((totalWebContent = in.readLine()) != null)
        {
            //System.out.println(totalWebContent);
            htmlString = htmlString + totalWebContent;
            //System.out.println(contentToPrint);
        }
        //System.out.println("htmlString\n" + htmlString);
    }
    catch(Exception e){
        e.printStackTrace();
    }
}

public String getTitle()
{
       retrieveContent();
      //System.out.println(htmlString);
      pageTitle = htmlString.substring(htmlString.indexOf("<title>")+ 7,
              htmlString.indexOf("</title>")); 
      return pageTitle;
}

public String getBody()
{
    String toDelete;
    String edited;
    retrieveContent();

    pageBody = htmlString.substring(htmlString.indexOf("<body")+5,
            htmlString.indexOf("</body>"));
    toDelete = pageBody.substring(0,pageBody.indexOf('<'));
    edited = pageBody.replace(toDelete,"");
    pageBody = edited
    formattedBody = pageBody.replaceAll("<[^>]*>", "");
    //System.out.println(formattedBody);
    return formattedBody;

}
4

2 に答える 2

4

投稿されたコードは、コンパイル、実行、およびテストできる小さな自己完結型プログラムであるSSCCEではないため、推測せずにこれに答えるとは思いません。したがって、私の推測では、テキストを追加している JTextArea は、JFrame に表示されているものと同じではありません。

ただし、これに自信を持って答えるには、SSCCEが必要です。特に、上記のクラスを作成する場所と、表示される JFrame に追加する場所を示すコードが必要です。

たとえば、BrowserFrame JFrame および BrowserPageReader モデル クラスのモックを使用して小さなSSCCEを作成すると、すべて正常に動作するように見えます。

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

public class BrowserPanel extends JPanel {

   private JTextField textField;
   private String urlText;
   private JTextArea textArea;
   private BrowserPageReader myModel;
   private String pageContent;
   private BrowserFrame myFrame;
   private String pageTitle;
   private String pageBody;

   public BrowserPanel(JTextField myTextField, BrowserPageReader model,
         BrowserFrame frame) {
      myFrame = frame;
      myModel = model;
      textField = myTextField;
      textField.addActionListener(new InputHandler());

      /*
       * JScrollPane areaScrollPane = new JScrollPane(textArea);
       * areaScrollPane.setVerticalScrollBarPolicy(
       * JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
       * 
       * areaScrollPane.setPreferredSize(new Dimension(250,250));
       */
      textArea = new JTextArea(20, 40);
      textArea.setEditable(false);
      textArea.setWrapStyleWord(true);
      textArea.setLineWrap(true);
      JScrollPane scroll = new JScrollPane(textArea);

      add(scroll);
   }

   public void paintComponent(Graphics g) {
      super.paintComponent(g);

   }

   private class InputHandler implements ActionListener {
      public void actionPerformed(ActionEvent e) {
         urlText = textField.getText();
         // textArea.append(urlText);

         myModel.setURL(urlText);
         pageTitle = myModel.getTitle();
         myFrame.setTitle(pageTitle);
         pageBody = myModel.getBody();
         textArea.setText(pageBody);
         System.out.println(pageBody); // This prints out exactly what Im
                                       // wanting
                                       // Its just a test
         textArea.repaint();
      }
   }

   private static void createAndShowGui() {
      BrowserFrame frame = new BrowserFrame();
      JTextField textField = new JTextField(10);
      BrowserPageReader myModel = new BrowserPageReader();
      BrowserPanel mainPanel = new BrowserPanel(textField, myModel, frame);

      frame.add(textField, BorderLayout.NORTH);
      frame.add(mainPanel, BorderLayout.CENTER);

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class BrowserFrame extends JFrame {

}

class BrowserPageReader {

   public void setURL(String urlText) {
      // does nothing for now. for testing purposes.
   }

   public String getBody() {
      return "body"; // for testing purposes
   }

   public String getTitle() {
      return "title"; // for testing purposes
   }

}

私のコードは「機能する」ので、上に投稿したコードにエラーがないことを証明しています。

あなたの仕事は、うまく動作しない同様のコードを投稿することです。代わりに、問題を示します。そのようなプログラムを作成する努力をすれば、エラーを切り分けることができると思います.2つのBrowserPanelsがあり、1つは表示され、もう1つは表示されていませんが、テキストを取得している可能性があります.ハンドラーで変更すると、直接のヘルプなしでエラーを解決できるようになります。



SwingWorker の編集など

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.Socket;
import java.net.URL;

public class BrowserPanel extends JPanel {

   private JTextField textField;
   private String urlText;
   private JTextArea textArea;
   private BrowserPageReader myModel;
   private String pageContent;
   private BrowserFrame myFrame;
   private String pageTitle;
   private String pageBody;

   public BrowserPanel(JTextField myTextField, BrowserPageReader model,
         BrowserFrame frame) {
      myFrame = frame;
      myModel = model;
      textField = myTextField;
      textField.addActionListener(new InputHandler());

      /*
       * JScrollPane areaScrollPane = new JScrollPane(textArea);
       * areaScrollPane.setVerticalScrollBarPolicy(
       * JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
       * 
       * areaScrollPane.setPreferredSize(new Dimension(250,250));
       */
      textArea = new JTextArea(20, 40);
      textArea.setEditable(false);
      textArea.setWrapStyleWord(true);
      textArea.setLineWrap(true);
      JScrollPane scroll = new JScrollPane(textArea);

      add(scroll);
   }

   private class InputHandler implements ActionListener {
      public void actionPerformed(ActionEvent e) {
         urlText = textField.getText();
         // textArea.append(urlText);
         System.out.println(urlText);

         myModel.setURL(urlText);

         myModel.getContent(new PropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent evt) {
               if (SwingWorker.StateValue.DONE == evt.getNewValue()) {
                  pageTitle = myModel.getTitle();
                  myFrame.setTitle(pageTitle);
                  pageBody = myModel.getBody();
                  textArea.setText(pageBody);
                  System.out.println(pageBody);
               }
            }
         });
         // textArea.repaint();
      }
   }

   private static void createAndShowGui() {
      BrowserFrame frame = new BrowserFrame();
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class BrowserFrame extends JFrame {

   public BrowserFrame() {
      BrowserPageReader myModel = new BrowserPageReader();
      setTitle("My Browser");
      Toolkit kit = Toolkit.getDefaultToolkit();
      Dimension screenSize = kit.getScreenSize();
      setSize(screenSize.width / 2, screenSize.height - 500);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      Container contentPane = getContentPane();
      JTextField textField = new JTextField(20);
      BrowserPanel myPanel = new BrowserPanel(textField, myModel, this);
      contentPane.add(myPanel);
      contentPane.add(textField, BorderLayout.PAGE_START);
      setVisible(true);

   }
}

class BrowserPageReader {

   private URL myURL;
   // private String webURL;
   private String totalWebContent;
   private String htmlString;
   private String contentToPrint = " ";
   private String urlPath;
   private String urlHost;
   private String pageTitle;
   private String pageBody;
   private String formattedBody;

   public void setURL(String webURL) {
      try {
         myURL = new URL(webURL);
         urlPath = myURL.getPath();
         urlHost = myURL.getHost();

      } catch (MalformedURLException e) {
         JOptionPane.showMessageDialog(null, "URL is incorrectly formatted");
      }
   }

   public void getContent(PropertyChangeListener listener) {
      RetrieveWorker worker = new RetrieveWorker();
      worker.addPropertyChangeListener(listener);
      worker.execute();
   }

   private void retrieveContent() {
      try {
         Socket socket = new Socket(urlHost, 80);
         PrintWriter out = new PrintWriter(socket.getOutputStream());
         BufferedReader in = new BufferedReader(new InputStreamReader(
               socket.getInputStream()));
         out.print("GET " + urlPath + " HTTP/1.1\n");
         out.print("Host: " + urlHost + "\n");
         out.print("\n");
         out.flush();
         while ((totalWebContent = in.readLine()) != null) {
            // System.out.println(totalWebContent);
            htmlString = htmlString + totalWebContent;
            // System.out.println(contentToPrint);
         }
         // System.out.println("htmlString\n" + htmlString);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

   public String getTitle() {
      // !! retrieveContent();
      System.out.println(htmlString);
      pageTitle = htmlString.substring(htmlString.indexOf("<title>") + 7,
            htmlString.indexOf("</title>"));
      return pageTitle;
   }

   public String getBody() {
      String toDelete;
      String edited;
      // !! retrieveContent();

      pageBody = htmlString.substring(htmlString.indexOf("<body") + 5,
            htmlString.indexOf("</body>"));
      toDelete = pageBody.substring(0, pageBody.indexOf('<'));
      edited = pageBody.replace(toDelete, "");
      pageBody = edited;
      formattedBody = pageBody.replaceAll("<[^>]*>", "");
      // System.out.println(formattedBody);
      return formattedBody;

   }

   private class RetrieveWorker extends SwingWorker<Void, Void> {
      @Override
      protected Void doInBackground() throws Exception {
         retrieveContent();
         return null;
      }

   }
}
于 2013-02-26T20:55:44.643 に答える
0

入力ハンドラーが複数回呼び出されているに違いありません。テキストを本文に設定してから印刷し、何らかの理由で空に戻すことができます。追加して、system.out.println ステートメントでこれをテストします。

System.out.println("outputStart: " + pagebody + " :END");

次に、入力ハンドラーが実行された回数を知ることができます。

于 2013-02-26T21:17:25.277 に答える