Java Swing: Призрачный текст, отображаемый при обновлении текста в JTextArea с частично прозрачным фоном - PullRequest
3 голосов
/ 14 января 2011

Итак, вот сделка:

У меня внутри есть JPanel и JTextArea.JPanel имеет цвет фона, который имеет альфа-значение 200, т.е.Вы можете частично увидеть фоновое изображение через JPanel.Разве это не называется частичной прозрачностью?В любом случае, тогда я установил непрозрачный JTextArea, чтобы я мог полностью видеть сквозь него:

JPanel p = new JPanel();
p.setBackground(new Color(237, 234, 215, 200);
JTextArea jta = new JTextArea("Blahblahblahblah");
jta.setOpaque(false);
p.add(jta);

Хорошо, поэтому, когда я нажимаю кнопку, текст будет изменен следующим образом:

jta.setText("new BlahBlah...");

Тогда это происходит: первый текст остается там с новой частично прозрачной пленкой. И текст, который я добавил, идет сверху, конечно, но прямо позади васможно увидеть предыдущий.Когда я несколько раз изменяю текст, призрак исчезает.

Снимок экрана в виде ссылки.

Перевод (на снимке экрана 3кадры подряд):
Слева:"Вопрос № 1 из 8: (политический вопрос)? (Мой комментарий: ОК)"
В центре: «Вопрос № 2 из 8: (другой вопрос, неважно)? (Мой комментарий: призрак есть! [И стрелка указывает на него])»
Правая рукаside: «Вопрос № 8 из 8: (еще один вопрос)? (Мой комментарий: ОК)» *

Если я уменьшу количество вопросов, которые эта программа поменяет, например, с 8 до 3,последний выглядит обычно хорошо, призрак исчез.Но иногда это зависит от того, что я делаю.Может быть, это как-то связано с нехваткой памяти (хотя я с трудом проглатываю ее)?

Так что, пожалуйста, помогите мне, парни!У меня есть срок в 48 часов.

PS.Если вам интересно, этот язык финский.Я работаю над школьным проектом: это будет машина сравнения, которая может иметь различные приложения: например, если у вас будут публичные выборы, пресса / СМИ могут использовать этот тип машины в Интернете, чтобы получитьМнение кандидата по любым вопросам, а затем избиратели могут также ввести свое мнение, и машина рассчитывает, какие кандидаты лучше всего соответствуют мыслям избирателя.Смотрите мою домашнюю страницу, т.е.блог проекта (на финском языке) для большего количества скриншотов на случай, если вы заинтересованы.

an55i

Ответы [ 2 ]

2 голосов
/ 14 января 2011
0 голосов
/ 15 января 2011

Наконец-то я понял это правильно!Это просто:

  1. И контейнер (в данном случае p), и компонент (jta) внутри должны быть setOpaque (false);
  2. Контейнер должен всегда очищаться, захватывая фоновый цвет внутреннего компонента, который - фактически - это цвет, который внутренний компонент получает от своего предка, т.е.сам контейнер.

А я как-то не прав?Ну, по крайней мере, код делает свое дело.

Поля класса:

private JTextArea jta;
private JPanel p;

Позже:

jta = new JTextArea("BlahBlahBLAH");
jta.setBackground(new Color(237, 234, 215, 200));
p = new JPanel() {
    @Override
    protected void paintComponent(Graphics g) {
        if(getContentPane().isAncestorOf(jta)) {
            g.setColor(jta.getBackground());
            g.fillRect(0, 0, getWidth(), getHeight());
        }
    }
};

p.setOpaque(false);
jta.setOpaque(false);
p.add(ta);

И это все.Я даже добавил немного границ и прочее, прежде чем добавить "jta" к "p".И что самое крутое, я на самом деле узнал кое-что об этом.Спасибо за поддержку!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...