更改JTextArea的背景颜色时的工件

时间:2011-10-10 23:48:33

标签: java swing transparency background-color 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

4 个答案:

答案 0 :(得分:2)

你只是缺少一个我认为的文字

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

答案 1 :(得分:0)

这是因为您使用部分透明的颜色作为组件的背景。尝试将背景颜色的Alpha通道值设置为255,并查看工件是否仍然显示。对repaint()的调用解决了这个问题,因为它会在绘制文本之前强制底层缓冲区填充背景颜色(我认为)。

答案 2 :(得分:-1)

我最近在上学的一个项目遇到了同样的问题。你也必须在框架上调用重绘(所以我更改了ActionListener以在构造函数中获取JFrame)。我还重新安排了代码以使用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();
    } 
}

答案 3 :(得分:-1)

我有类似的问题,并通过对相关组件使用validate()方法解决它们。它可能是很多东西......也许我会为此而受到抨击但是 - 作为一个刚刚用Swing度过整整一年的人说话 - 我对你说:跑! Swing刚刚被弃用了。

学习JavaFx 2.0并帮助埋葬Swing。