0

我正在尝试更改 JTextPane 的内容。我认为问题是范围问题。您无法编译此代码,但您明白了……由于多线程,这可能很难。TYIA

C:\ucdhb2\gaia\inigui\inigui15\src\inigui13.java:259: error: local
variable theframe is accessed from within inner class; needs to be declared final
                    theframe.mainfield.getStyledDocumemt().insertString(1, "hellooo",
null);
                    ^ C:\ucdhb2\gaia\inigui\inigui15\src\inigui13.java:259: error: cannot
find symbol
                    theframe.mainfield.getStyledDocumemt().insertString(1, "hellooo",
null);
                                      ^   symbol:   method getStyledDocumemt()   location: variable mainfield of type JTextField
2 errors

代码

   class inigui13 extends applet  {

        Socket echoSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;
        JTextField mainfield;

      public void init() { 

        inigui13 theframe = new inigui13(); 
        theframe.setSize(700, 525); 
        theframe.setVisible(true); 

        try {

            echoSocket = new Socket("192.168.2.3",  9900);
                        out = new PrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader( echoSocket.getInputStream() ) );
        } catch (UnknownHostException e) {

            System.err.println("Sstemexit");
            System.exit(1);

        } catch (IOException e) {

                System.err.println("IOFailed");
                System.exit(1);
        }


        Runnable readsock = new Runnable()  {

            public void run()   {

                boolean recvread = true;

                while( recvread )   {

                    BufferedReader stdIn = new BufferedReader( new InputStreamReader(System.in));

                    try {


                    theframe.mainfield.getStyledDocumemt().insertString(1, "hellooo", null);

                    } catch( IOException e ){}

                }

                  }

                    try {

                        out.close();
                        in.close();
                        echoSocket.close();
                    } catch( IOException e ){}


        }

        };


        Thread readsockt = new Thread(readsock);
        readsockt.start();
       }


       public inigui13  {

          mainfield = new JTextPane;
          this.add(mainfield);
      }
};
       }
4

1 回答 1

3

不要,永远,更新,更改或修改任何线程以外的任何UI 组件,然后是事件调度线程。这几乎涵盖了 Swing 的前 10 条诫命。

您的代码是何时使用SwingWorker.

您可能想通读Swing 中的并发

例子

public class StreamReaderWorker extends SwingWorker<Object, String> {

    private JTextPane field;

    public StreamReaderWorker(JTextPane field) {
        this.field = field;
    }

    @Override
    protected void process(List<String> chunks) {
        for (String chunk : chunks) {
            try {
                field.getStyledDocument().insertString(1, "chunk", null);
            } catch (BadLocationException ex) {
                ex.printStackTrace();
            }
        }
    }

    @Override
    protected String doInBackground() throws Exception {
        boolean recvread = true;
        while (recvread) {
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
            try {
                publish("hellooo");
            } catch (IOException e) {
            }
        }
        return null;
    }
}
于 2012-11-29T04:04:10.583 回答