0

単純なJavaSwingコンソールを変更していて、キーワードの強調表示の形式を追加することにしました(フラグが立てられた行の横の領域に色を付けることによって)。キーワード「Exception」を検索してエラーをスローすると正常に動作するようになりましたが、キーワードを含むSystem.out.printlnを実行すると、すべてが強調表示されます。この文字列は、すでに入力されているすべての文字列と何らかの形で結合されているため、このエラーの原因になっていると思いますが、修正に問題があります。

スクリーンショットは次のとおりです。

ここに画像の説明を入力してください

「HelloWorld2」および「このコンソールでエラーをスローします」というテキストは強調表示しないでください。

// Edited by Jeff B
// A simple Java Console for your application (Swing version)
// Requires Java 1.1.5 or higher
//
// Disclaimer the use of this source is at your own risk. 
//
// Permision to use and distribute into your own applications
//
// RJHM van den Bergh , rvdb@comweb.nl

import java.io.*;
import java.util.ArrayList;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class textAreaC extends JTextArea {
    int rowCount;
    int rowHeight;
    ArrayList<Point> exPoint = new ArrayList<Point>();

    public textAreaC() {
        rowHeight = this.getRowHeight();
    }

    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(Color.red);
        for (int i = 0; i < exPoint.size(); i++) {
            g.fillRect(3, exPoint.get(i).x * rowHeight, 10, exPoint.get(i).y
                    * rowHeight);
        }
    }

    public void append(String str) {
        int rows = str.split("\r\n|\r|\n").length;
        if (str.contains("Exception")) {
            //System.out.println("This was the string: " + str + "It has " + rows + "rows" + " End String");
            exPoint.add(new Point(rowCount, rows));
        }
        rowCount += rows;
        super.append(str);

    }
}

public class Console extends WindowAdapter implements WindowListener,
        ActionListener, Runnable {
    private JFrame frame;
    private textAreaC textArea;
    private Thread reader;
    private Thread reader2;
    private boolean quit;

    private final PipedInputStream pin = new PipedInputStream();
    private final PipedInputStream pin2 = new PipedInputStream();

    Thread errorThrower; // just for testing (Throws an Exception at this Console

    public Console() {
        // create all components and add them
        frame = new JFrame("Java Console");
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = new Dimension((int) (screenSize.width / 2),
                (int) (screenSize.height / 2));
        int x = (int) (frameSize.width / 2);
        int y = (int) (frameSize.height / 2);
        frame.setBounds(x, y, frameSize.width, frameSize.height);

        textArea = new textAreaC();
        textArea.setEditable(false);
        textArea.setMargin(new Insets(3, 20, 3, 3));
        JButton button = new JButton("clear");
        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add(new JScrollPane(textArea),
                BorderLayout.CENTER);
        frame.getContentPane().add(button, BorderLayout.SOUTH);
        frame.setVisible(true);
        frame.addWindowListener(this);
        button.addActionListener(this);

        try {
            PipedOutputStream pout = new PipedOutputStream(this.pin);
            System.setOut(new PrintStream(pout, true));
        } catch (java.io.IOException io) {
            textArea.append("Couldn't redirect STDOUT to this console\n"
                    + io.getMessage());
        } catch (SecurityException se) {
            textArea.append("Couldn't redirect STDOUT to this console\n"
                    + se.getMessage());
        }

        try {
            PipedOutputStream pout2 = new PipedOutputStream(this.pin2);
            System.setErr(new PrintStream(pout2, true));
        } catch (java.io.IOException io) {
            textArea.append("Couldn't redirect STDERR to this console\n"
                    + io.getMessage());
        } catch (SecurityException se) {
            textArea.append("Couldn't redirect STDERR to this console\n"
                    + se.getMessage());
        }

        quit = false; // signals the Threads that they should exit

        // Starting two seperate threads to read from the PipedInputStreams             
        //
        reader = new Thread(this);
        reader.setDaemon(true);
        reader.start();
        //
        reader2 = new Thread(this);
        reader2.setDaemon(true);
        reader2.start();

        // testing part
        // you may omit this part for your application
        // 
        //System.out.println("Test me please Exception\n testing 123");
        System.out.flush();
        System.out.println("Hello World 2");

        System.out.println("\nLets throw an error on this console");
        errorThrower = new Thread(this);
        errorThrower.setDaemon(true);
        errorThrower.start();
    }

    public synchronized void windowClosed(WindowEvent evt) {
        quit = true;
        this.notifyAll(); // stop all threads
        try {
            reader.join(1000);
            pin.close();
        } catch (Exception e) {
        }
        try {
            reader2.join(1000);
            pin2.close();
        } catch (Exception e) {
        }
        System.exit(0);
    }

    public synchronized void windowClosing(WindowEvent evt) {
        frame.setVisible(false); // default behaviour of JFrame 
        frame.dispose();
    }

    public synchronized void actionPerformed(ActionEvent evt) {
        textArea.setText("");
    }

    public synchronized void run() {
        try {
            while (Thread.currentThread() == reader) {
                try {
                    this.wait(100);
                } catch (InterruptedException ie) {
                }
                if (pin.available() != 0) {
                    String input = this.readLine(pin);
                    textArea.append(input);
                    //System.out.println(input.split("\r\n|\r|\n").length);
                }
                if (quit)
                    return;
            }

            while (Thread.currentThread() == reader2) {
                try {
                    this.wait(100);
                } catch (InterruptedException ie) {
                }
                if (pin2.available() != 0) {
                    String input = this.readLine(pin2);
                    textArea.append(input);
                }
                if (quit)
                    return;
            }
        } catch (Exception e) {
            textArea.append("\nConsole reports an Internal error.");
            textArea.append("The error is: " + e);
        }

        // just for testing (Throw a Nullpointer after 1 second)
        if (Thread.currentThread() == errorThrower) {
            try {
                this.wait(1000);
            } catch (InterruptedException ie) {
            }
            throw new NullPointerException(
                    "Application test: throwing an NullPointerException It should arrive at the console");
        }
    }

    public synchronized String readLine(PipedInputStream in) throws IOException {
        String input = "";
        do {
            int available = in.available();
            if (available == 0)
                break;
            byte b[] = new byte[available];
            in.read(b);
            input = input + new String(b, 0, b.length);
        } while (!input.endsWith("\n") && !input.endsWith("\r\n") && !quit);
        return input;
    }

    public static void main(String[] arg) {
        new Console(); // create console with not reference 
    }
}

私は少しテストを行っています、このプリントアウトを見てください: ここに画像の説明を入力してください

これを複製するには、reader(1)にSystem.out.prinlnステートメントを追加し、文字列の最後に入力を追加します。これは私のprinlnsがどのように見えるかです:

System.out.println("There should be a string before me.");
System.out.flush();
System.out.println("Test me please Exception");
System.out.flush();
System.out.println("Test print 2");
System.out.flush();
System.out.println("Test print 3");
System.out.flush();
System.out.println("Test me please Exception 2");
System.out.flush();
System.out.println("Exception here lololol");
System.out.flush();
System.out.println("Hello World 2");
System.out.flush();

そして私の読者はこのように見えます:

if (pin.available()!=0)
    {

        String input=this.readLine(pin);
        System.out.println("this was printed by the thread second " + input);
        textArea.append(input);
        //System.out.println(input.split("\r\n|\r|\n").length);
    }
if (quit) return;

それはそれらすべての原則を単一の入力として扱っています、これはJavaが行っていることですか、それとも私は何かを見逃していますか?

4

1 に答える 1

1

HTML を出力に使用すると、より簡単になります。最初のテキスト<html>と同じように (非常に緩い HTML)。または、コンテンツ タイプを設定します。などで行を追加<br>します。

より柔軟です。


複数行の文字列を 2 回追加しました。行数を取得すると、文字列内のすべての行が赤になります。おそらく、この最適化されていないバージョンは、意図したものにより近いものです。

@Override
public void append(String str) {
    String[] lines = str.split("\r\n|\r|\n");
    int rows = lines.length;
    for (String line : lines) {
        super.append(line + "\n");
        if (line.contains("Exception")) {
            exPoint.add(new Point(rowCount, 1)); // 1 line
        }
        ++rowCount;
    }
}
于 2013-02-21T16:07:27.573 に答える