2011-10-10 54 views
6

Tôi gặp sự cố khi đặt màu nền của JTextArea sau khi tôi đặt văn bản. Mã này như sau:Hiện vật khi thay đổi màu nền của 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(); 
    } 
} 

Nếu tôi nhấp vào nút, nền của JTextArea thay đổi, nhưng tôi cũng nhận được một số hiện vật trong vùng văn bản. Các "repaint" dường như sửa chữa nó, nhưng trong ví dụ ứng dụng của tôi, nó không giúp đỡ, vì vậy tôi đã tự hỏi liệu có một giải pháp tốt hơn cho việc này.

example image

+6

hãy có một cái nhìn tại blog của Rob Camick của về vấn đề này: [nền-với-minh bạch] (http://tips4java.wordpress.com/2009/ 05/31/nền-với-minh bạch /) –

+0

Tuyệt vời! Đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn bạn đã bình luận. – Max

+0

@EdStaub: "Câu trả lời" của tôi chỉ là một liên kết và do đó phải là một nhận xét duy nhất. –

Trả lời

-1

tôi đã cùng một vấn đề với một dự án tôi làm việc trên cho trường thời gian gần đây. Bạn phải gọi repaint trên frame quá (vì vậy tôi đã thay đổi ActionListener để có một JFrame trong constructor). Tôi cũng sắp xếp lại mã để sử dụng khung nội dung của JFrame. Điều này có vẻ phù hợp với tôi:

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

Đó là vì bạn đang sử dụng màu trong suốt một phần cho nền của thành phần. Thử đặt giá trị kênh alpha của màu nền thành 255 và xem các hiện vật vẫn hiển thị hay không. Cuộc gọi đến repaint() khắc phục sự cố vì nó buộc bộ đệm cơ bản phải được tô màu nền của bạn trước khi vẽ văn bản (tôi nghĩ).

-1

Tôi đã gặp sự cố tương tự và giải quyết chúng bằng cách sử dụng phương thức validate() trên thành phần được đề cập. Rất nhiều thứ có thể là ... có lẽ tôi sẽ bị đóng sập vì chuyện này nhưng - nói là người vừa trải qua cả năm lao động với Swing - tôi nói với bạn: RUN !! Swing chỉ là về việc không được chấp nhận.

Tìm hiểu JavaFx 2.0 và giúp bung Swing.

2

Bạn chỉ cần thiếu một văn bản tôi nghĩ rằng

Action clickAction = new AbstractAction("Click") { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     area.setBackground(new Color(0, 0, 123, 138)); 
     area.repaint(); 
    } 
}; 
Các vấn đề liên quan