Артефакты при изменении цвета фона JTextArea - PullRequest
6 голосов
/ 11 октября 2011

У меня проблема с установкой цвета фона 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 ]

2 голосов
/ 21 ноября 2012

Мне кажется, вам просто не хватает одного текста

Action clickAction = new AbstractAction("Click") {
    @Override
    public void actionPerformed(ActionEvent e) {
        area.setBackground(new Color(0, 0, 123, 138));
        area.repaint();
    }
};
0 голосов
/ 18 января 2012

Это потому, что вы используете частично прозрачный цвет для фона компонента. Попробуйте установить значение альфа-канала цвета фона на 255 и посмотреть, по-прежнему ли обнаруживаются артефакты. Вызов repaint() устраняет проблему, потому что заставляет базовый буфер заполняться вашим фоновым цветом до рисования текста (я думаю).

0 голосов
/ 22 апреля 2012

У меня были похожие проблемы, и я решил их, используя метод validate () для рассматриваемого компонента.Так много всего, что может быть ... может быть, меня за это ударит, но, говоря о том, кто только что целый год работал с Swing, я говорю вам: беги !!Свинг почти устарел.

Изучите JavaFx 2.0 и помогите похоронить Swing.

0 голосов
/ 18 октября 2011

У меня была та же проблема с проектом, над которым я недавно работал в школе. Вы также должны вызвать 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();
    } 
}
...