JPanel скрывает изображение - PullRequest
1 голос
/ 04 июля 2011

У меня проблемы с выяснением, почему возникает следующая проблема: В программе, использующей "extends Frame" для создания окна, я могу использовать BufferedImage для рисования в графическом контексте фрейма (не JFrame), иэто выглядит просто отлично.Однако в тот момент, когда я объявляю JPanel, весь текст, нарисованный BufferedImage, становится неясным (не полностью, но полупрозрачным и трудным для чтения), даже если я не добавляю JPanel к JFrame.

Вот упрощенная версия кода:

import java.awt.*;
import java.awt.event.*;
import javax.swing.Timer;
import java.awt.image.*;
import javax.swing.*;

public class MyProgram extends Frame {

    static Frame f;
    static Timer timer;

    public static void main(String[] args) {

        f = new Frame();
        f.setSize(400, 200);
        f.setResizable(false);
        f.setVisible(true);

        f.addKeyListener(new KeyAdapter() {

        public void keyPressed(KeyEvent e) {

            drawScreen();
        }
    });

    drawScreen();
}

public static void drawScreen() {

    BufferedImage off_i = new BufferedImage(f.getWidth(), f.getHeight(), BufferedImage.TYPE_INT_RGB);
    Graphics g = off_i.createGraphics();

    g.setColor(new Color(50, 50, 50));
    g.drawString("Hit any key; why does this text change?", 15, f.getHeight() - 10);

    Graphics off_g = f.getGraphics();
    off_g.drawImage(off_i, 0, 0, null);

    JPanel panel = new JPanel();
    }
}

Я мог бы понять, что возникла проблема, если бы я добавил JPanel к JFrame и не сделал 'Я не могу установить никаких границ его видимости, но даже создание JPanel дает эту проблему, которая мне кажется странной.

По сути, я пытаюсь сделать существующую программу, которая у меня есть.прекрасно работает без JPanel, и я хочу добавить к нему JTextArea, чтобы я мог принимать копирование / вставку текста для изменения отображения программы.

Мое понимание Java немного нечеткоеКак я узнал, главным образом, из хобби, а не формально, но я всегда стараюсь узнать больше, когда смогу.Спасибо за помощь!

Обновление: я обнаружил, что эта проблема возникает только при повторном вызове функции draw после объявления JPanel, хотя я до сих пор не понимаю, почему она это делает иликак обойти это.

Ответы [ 4 ]

3 голосов
/ 04 июля 2011

лучше бы поместить Image в JLabel и , как использовать Icon

, пожалуйста, прочитайте Использование компонентов Swing и как LayoutManager работает

тонн примеров на java2s.com

2 голосов
/ 04 июля 2011
  1. Не смешивайте компоненты AWT с компонентом Swing. То есть вы должны использовать JFrame, а не Frame.

  2. Не используйте getGraphics (). Настраиваемое рисование выполняется путем переопределения метода paintComponent () для JPanel (или JComponent). Вы просто используете объект Graphics, который передается в метод. Затем вы добавляете панель в рамку.

  3. Как уже упоминалось, использовать JLabel проще, потому что вам не нужно делать никаких пользовательских рисований. В руководстве также есть раздел «Как использовать иконки».

1 голос
/ 18 августа 2011

Как ответ на мой оригинальный вопрос:

Кажется, что инициализация JPanel вместе с командами awt draw () вызывает сглаживание текста , что делает текст более трудным для чтения, частично затемненным, более тонким и т. Д. Хотя я пытался установить setRenderingHint () с VALUE_TEXT_ANTIALIAS_OFF, это не решило проблему.Но, как отмечали другие авторы, нецелесообразно смешивать два компонента.

Хотя это не совсем решает мою проблему, оно действительно отвечает на вопрос о том, что происходит, что сглаживание текста как некоторый результатJPanel (это звучит правильно?).В идеале я бы не хотел переписывать весь код, просто чтобы добавить одну JTextArea в уже существующую кодовую базу.Но, возможно, хорошо время от времени пересматривать старый код и обновлять его там, где он может быть неисправен.

Спасибо всем за комментарии, информацию и ссылки на ресурсы!

1 голос
/ 04 июля 2011

Я пытался запустить твой код.И хотя описанный вами эффект не происходит в моей системе, я могу вам кое-что порекомендовать.

Сначала попробуйте создать панель до ее визуализации.В этом случае Java не нужно переупорядочивать компоненты, которые уже находятся на экране.

Во-вторых, если у вас есть для рисования объектов на видимом кадре, вызовите validate () контейнера, когда вы закончите.Это заставляет Java перестраивать вещи.

В-третьих, когда вы используете методы drawXXX (), создайте свой собственный класс, который расширяет Component, JComponent, Canvas и переопределяет его метод `paint (Graphics).В этом случае система будет вызывать этот метод каждый раз, когда это необходимо (например, при изменении размера окна), и ваш пользовательский интерфейс будет окрашен снова.

Кстати, у меня есть 2 вопроса:

  1. почему вы используете drawText () вместо Label или JLabel?Используйте их и избегайте подобных проблем.

  2. Почему вы расширяете свой класс из Frame и не используете этот факт, но создаете еще один экземпляр Frame?

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