2017-01-10 6 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

私はあなたがあなたのMCVEの一部としてそれを追加するのを忘れたので、私は、私自身のmain方法でコードを実行する方法配置するために忘れていました:

それは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); 

nullに設定します。

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

もう一つの問題:これは、スレッドセーフスイングされていません。

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(...)電話を作っている、これはデバッグ断続的にハード引き起こす可能性がありますスローされる例外。このテキストコンポーネントには、のイベントディスパッチスレッドのを必ず追加してください。

+0

それをよく見てください!作品。いくつかのことを言うと申し訳ありません...塩味があります。非常に悪い日。ありがとう、これは問題を解決しました! –

+0

あなたは私より速く、1 + – Frakcool

+0

@Frakcool:1+もあなたの答えに気付いた。 –