【问题标题】:Artifacts when changing background colour of JTextArea更改 JTextArea 的背景颜色时的伪影
【发布时间】:2011-12-04 22:01:47
【问题描述】:

在设置文本后设置 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 的背景会发生变化,但我也会在文本区域中看到一些伪影。 “重绘”似乎可以解决它,但在我的应用程序示例中,它没有帮助,所以我想知道是否有更好的解决方案。

【问题讨论】:

  • 请查看 Rob Camick 的博客:backgrounds-with-transparency
  • 太棒了!这正是我一直在寻找的。感谢您的评论。
  • @EdStaub:我的“答案”只是一个链接,因此应该是唯一的评论。

标签: java swing transparency background-color jtextarea


【解决方案1】:

我认为你只是错过了一条文字

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我最近为学校工作的一个项目遇到了同样的问题。您也必须在框架上调用 repaint(所以我将 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();
          } 
      }
      

      【讨论】:

        【解决方案4】:

        我遇到了类似的问题,并通过在相关组件上使用 validate() 方法解决了这些问题。可能有很多事情......也许我会为此受到抨击,但是 - 作为一个刚刚花了整整一年时间与 Swing 一起工作的人来说 - 我对你说:快跑! Swing 几乎已被弃用。

        学习 JavaFx 2.0 并帮助埋葬 Swing。

        【讨论】:

          猜你喜欢
          • 2019-08-18
          • 2017-08-31
          • 1970-01-01
          • 1970-01-01
          • 2016-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-30
          相关资源
          最近更新 更多