एक से अधिक systen.out.println () को एक से अधिक कक्षाओं से एक JTextArea जैसे एकल GUI में कैसे प्रदर्शित करें।

नमस्ते, मैं एक स्कूल प्रोजेक्ट कर रहा हूं जहां मेरे पास कुछ कक्षाएं हैं जिनमें कंसोल आउटपुट प्रदर्शित करने के लिए system.out.println() है। हालाँकि अब मुझे कंसोल आउटपुट को एक gui में प्रदर्शित करने की आवश्यकता है।

उदाहरण के लिए कक्षा एक में system.out.println("class one"); कक्षा दो में system.out.println ("कक्षा 2");

मेरे पास एक जीयूआई वर्ग है, guiJava.class जहां इसमें JtextArea है।

किसी को पता है कि यह कैसे करना है?

मैंने ऑनलाइन पढ़ा है इस कोड का उपयोग करना है:

    PrintStream standardOut;

    PrintStream printStream = new PrintStream(new CustomOutputStream(jTextArea1));

    // keeps reference of standard output stream
    standardOut = System.out;

    // re-assigns standard output stream and error output stream
    System.setOut(printStream);
    System.setErr(printStream);

लेकिन ऐसा प्रतीत होता है कि guiJava.class में केवल System.out.println () को दिखाया गया है, न कि कक्षा एक और कक्षा 2 से सभी sysout लाइनों को।

0
sykice 9 मार्च 2020, 22:57
1
मेरा सुझाव है कि आप Swing बुनियादी बातों का अध्ययन किसी अच्छे ट्यूटोरियल से करें, उदा। docs.oracle.com/javase/tutorial/uiswing/start/index. एचटीएमएल
 – 
Arvind Kumar Avinash
9 मार्च 2020, 23:18
@ArvindKumarAvinash अनुशंसा जैसे ट्यूटोरियल का अध्ययन करें। एक चीज जो आप पाएंगे वह यह है कि आप JTextArea बनाने के लिए System.out का उपयोग नहीं करते हैं।
 – 
ordonezalex
10 मार्च 2020, 00:20

2 जवाब

यहां एक उदाहरण दिया गया है जो PipedOutputStream (यह पोस्ट।)

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

public class TextAreaPrinter extends JFrame {

    private JTextArea outputArea;
    private JScrollPane outputScrollPane;

    public TextAreaPrinter() {
        setTitle("TextAreaPrinter");
        setSize(640, 480);
        setMinimumSize(new Dimension(640,480));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        outputArea = new JTextArea();
        outputArea.setEditable(false);
        outputScrollPane = new JScrollPane(outputArea);
        outputScrollPane.setPreferredSize(new Dimension(250, 250));
        outputScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        add(outputScrollPane);

        setVisible(true);
    }

    public static void main(String[] args) {
        TextAreaPrinter textAreaPrinter = new TextAreaPrinter();

        try {
            PrintStream out = new PrintStream(new MyOutputStream(textAreaPrinter.outputArea), true, "UTF-8");
            System.setOut(out);
        } catch (IOException ioe) {
            textAreaPrinter.outputArea.append(ioe.getMessage());
        }

        System.out.println("class one");
        System.out.println("class 2");
    }
}

class MyOutputStream extends OutputStream {

    private PipedOutputStream out = new PipedOutputStream();
    private Reader reader;
    private JTextArea outputArea;

    public MyOutputStream(JTextArea outputArea) throws IOException {
        this.outputArea = outputArea;
        // Set the input to be piped to our output stream
        PipedInputStream in = new PipedInputStream(out);
        reader = new InputStreamReader(in, "UTF-8");
    }

    public void write(int i) throws IOException {
        out.write(i);
    }

    public void write(byte[] bytes, int i, int i1) throws IOException {
        out.write(bytes, i, i1);
    }

    public void flush() throws IOException {
        if (reader.ready()) {
            char[] chars = new char[1024];
            int n = reader.read(chars);

            String text = new String(chars, 0, n);
            // Write the text to the JTextArea
            outputArea.append(text);
        }
    }
}

यदि आप इसे चलाते हैं तो आप System.out.println(...) को main(...) फ़ंक्शन प्रिंट में JTextArea पर कॉल देखेंगे।

इसके अलावा, यदि आपके पास पहले से ही आपका अधिकांश GUI है और आपको इस सभी कोड की आवश्यकता नहीं है, तो आपको बस एक JTextArea बनाना होगा, और कोड का महत्वपूर्ण हिस्सा यह है:

try {
    PrintStream out = new PrintStream(new MyOutputStream(textAreaPrinter.outputArea), true, "UTF-8");
    System.setOut(out);
} catch (IOException ioe) {
    textAreaPrinter.outputArea.append(ioe.getMessage());
}

ऊपर दिए गए स्निपेट को चलाने के बाद, System.out.println(...) को सभी कॉल JTextArea पर जाने चाहिए।

0
agillgilla 9 मार्च 2020, 23:19
public static void main(String [] args) {
    JTextArea area = new JTextArea();

    PrintStream stream = new PrintStream(new TextAreaOutputStream(area));
    System.setOut(stream);
    System.setErr(stream);

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(new JScrollPane(area));
    frame.setLocationRelativeTo(null);
    frame.setSize(400, 200);
    frame.setVisible(true);

    System.out.println();
    System.out.println("test");
    System.out.println();
    System.out.println("test 2");
    System.out.println();
    System.out.println("test 3");
}

public static class TextAreaOutputStream extends OutputStream {

      private JTextArea textArea;

      public TextAreaOutputStream(JTextArea textArea) {
          this.textArea = textArea;
      }

      @Override
      public void write(int character) throws IOException {
          textArea.append(String.valueOf((char) character));
          textArea.setCaretPosition(textArea.getDocument().getLength());
      }
}
0
Ryan 9 मार्च 2020, 23:23