2017-01-10 102 views
0

這是我的問題。 當我使用下面的代碼:java中的奇怪空白JFrame

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\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(); 
} 

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

這讓我的控制檯,但增加了文本區邊界之間的白線。我如何刪除這個

+1

讓我們看看你的[mcve]。 –

+0

那麼,你想把文字放在底部?請提供一個有效的[mcve] – Frakcool

+0

很難在圖片中看到,但在文本的右側有一個白色條,用於區分文本區域和邊框。我如何擺脫這個邊界? –

回答

1

問題是因爲JScrollPane也有邊框。

在這種情況下,你可以將其刪除:

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

並添加JScrollPane到您的框架爲:

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

但是,這將刪除按鈕和文本區域之間的邊界

所以你需要在你的JButton的頂部創建一個MatteBorder

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

因此,這將是這樣的:

enter image description here

我忘了把我怎麼跑我自己的main方法你的代碼,因爲你忘了將其添加爲您MCVE的一部分:

它將把程序上Event Dispatch Thread (EDT)

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

你忘了JScrollPane有一個邊框。

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

將其設置爲空。

JScrollPane scrollPane = new JScrollPane(textArea); 
scrollPane.setBorder(null); 
frame.getContentPane().add(scrollPane, BorderLayout.CENTER); 

另一個問題:這不是Swing線程安全的:

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

} 

你讓textArea.append(...)接聽Swing事件線程的,這可能會導致難以調試間歇拋出異常。請務必在的事件分派線程上追加此文本組件

+0

好吧,看看那個!作品。對不起,有人說......鹹。非常糟糕的一天。謝謝,這確實解決了這個問題! –

+0

你比我快,注意到它,1+ – Frakcool

+0

@Frakcool:1+以及你的答案。 –