2011-10-10 16 views
6

JTextAreaの背景色を設定した後、背景色を設定する際に問題が発生します。コードは以下の通りである:JTextAreaの背景色を変更するとアーティファクトが発生する

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JTextArea; 

public class Test extends JFrame { 

    private JTextArea area; 

    public Test() { 
     this.setLayout(new BorderLayout()); 
     this.add(this.area = new JTextArea(), BorderLayout.CENTER); 
     this.add(new JButton(clickAction), BorderLayout.SOUTH); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setPreferredSize(new Dimension(500, 200)); 
     this.pack(); 
     this.area.setText("this is just a test"); 
     this.setVisible(true); 
    } 

    Action clickAction = new AbstractAction("Click") { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      area.setBackground(new Color(0, 0, 123, 138)); 
      // repaint(); 
     } 
    }; 

    public static void main(String[] args) { 
     new Test(); 
    } 
} 

私はボタン、JTextAreaの変化の背景をクリックして、私はまた、テキスト領域にいくつかの成果物を取得した場合。 "再塗装"はそれを修正するようですが、私のアプリケーションの例では役に立たないので、もっと良い解決策があるのか​​どうか疑問に思っていました。

example image

+6

考える一つのテキストが欠落し、この上のロブCamickのブログを見てくださいしている:[背景-と透明性](http://tips4java.wordpress.com/2009/ 05/31/backgrounds-with-transparency /) –

+0

優秀!それはまさに私が探していたものです。コメントいただきありがとうございます。 – Max

+0

@EdStaub:私の "答え"はリンクだけなので、唯一のコメントでなければなりません。 –

答えて

-1

私は最近、学校のために働いていたプロジェクトと同じ問題がありました。フレーム上で再描画を呼び出す必要があります(コンストラクタでJFrameを取得するようにActionListenerを変更しました)。また、JFrameのコンテンツペインを使用するようにコードを再調整しました。これは私にとってはうまくいくようです:

public Test() { 
    this.area = new JTextArea(); 

    this.getContentPane().setLayout(new BorderLayout()); 
    this.getContentPane().add(area, BorderLayout.CENTER); 

    JButton button = new JButton(new MyClickAction(this)); 
    button.setText("Click Me!"); 

    this.getContentPane().add(button, BorderLayout.SOUTH); 

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setPreferredSize(new Dimension(500, 200)); 

    this.area.setText("this is just a test"); 

    this.pack(); 
    this.setVisible(true); 
} 

public static void main(String[] args) { 
    new Test(); 
} 

private class MyClickAction extends AbstractAction 
{ 
    private JFrame frame; 

    public MyClickAction(JFrame frame) { 
     this.frame = frame; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     area.setBackground(new Color(0, 0, 123, 138)); 
     frame.repaint(); 
    } 
} 
0

コンポーネントの背景に部分的に透明な色を使用しているからです。背景色のアルファチャンネル値を255に設定し、アーティファクトがまだ表示されているかどうかを確認してください。 repaint()を呼び出すと、テキストをペイントする前に背景の色で塗りつぶされるバッファが強制されるため、問題が修正されています(私は思う)。

-1

同様の問題があり、問題のコンポーネントでvalidate()メソッドを使用して解決しました。これほど多くのことがあるかもしれません...おそらく私はこのために打ちのめされるでしょう - しかし、スイングで一生懸命働いている人として話してください - 私はあなたに言う:ラン!スイングは廃止されました。

JavaFx 2.0を学び、Swingの埋め込みに役立ちます。

2

あなたはちょうど私が

Action clickAction = new AbstractAction("Click") { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     area.setBackground(new Color(0, 0, 123, 138)); 
     area.repaint(); 
    } 
}; 
関連する問題