java JFrame中奇怪的空白

2022-01-11 00:00:00 console java swing jframe

这是我的问题.当我使用以下代码时:

Here is my problem. When i use the following code:

package xyz.lexium.giapb.ui;

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

public class ConsoleWindow extends WindowAdapter implements WindowListener, ActionListener, Runnable {

private JFrame frame;
private JTextArea textArea;
private Thread reader;
private Thread reader2;
private boolean quit;

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

public ConsoleWindow() {
    frame = new JFrame("GIAPB - Console");
    Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (int) ((dimension.getWidth() - frame.getWidth()) / 3);
    int y = (int) ((dimension.getHeight() - frame.getHeight()) / 3);
    frame.setSize(x, y);
    textArea = new JTextArea();
    textArea.setEditable(false);
    JButton button = new JButton("clear");
    button.setBorder(null);
    button.setBackground(Color.BLACK);
    button.setForeground(Color.white);
    frame.getContentPane().setBackground(Color.BLACK);
    frame.getContentPane().setLayout(new BorderLayout());
    frame.getContentPane().add(new JScrollPane(textArea), BorderLayout.CENTER);
    frame.getContentPane().add(button, BorderLayout.SOUTH);
    frame.addWindowListener(this);
    textArea.setBackground(Color.BLACK);
    textArea.setForeground(Color.white);
    textArea.setBorder(null);
    frame.setVisible(true);
    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
" + io.getMessage());
    } catch (SecurityException se) {
        textArea.append("Couldn't redirect STDOUT to this console
" + 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
" + io.getMessage());
    } catch (SecurityException se) {
        textArea.append("Couldn't redirect STDERR to this console
" + 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();
}

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);
            }
            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("
Console reports an Internal error.");
        textArea.append("The error is: " + e);
    }

}

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("
") && !input.endsWith("
") && !quit);
    return input;
}
}

它是我的控制台,但在文本区域和边框之间添加了一条白线.这个怎么去掉

It makes my console, but adds a white line between the text area and the border. How do i remove this

推荐答案

问题是因为 JScrollPane 也有边框.

The problem is because a JScrollPane also has a border.

在这种情况下,您可以使用以下命令将其删除:

In this case you can remove it with:

JScrollPane scroll = new JScrollPane(textArea);
scroll.setBorder(null);

并将 JScrollPane 添加到您的框架中:

And adding the JScrollPane to your frame as:

frame.getContentPane().add(textArea, BorderLayout.CENTER);

但这会移除按钮和文本区域之间的边框

But that will remove the border between the button and the text area

所以你需要在 JButton 的顶部创建一个 MatteBorder:

So you need to create a MatteBorder on the top of your JButton:

button.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.white));

所以它看起来像这样:

我忘记将运行代码的方式放在我自己的 main 方法中,因为您忘记将其添加为 MCVE:

I had forgotten to place how I ran your code in my own main method, because you forgot to add it as part of your MCVE:

它将把程序放在 事件调度线程 (EDT)

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

相关文章