обновление формы на полностью прозрачном окне в Java - PullRequest
0 голосов
/ 02 июля 2011

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

import java.awt.event.MouseEvent;
import javax.swing.*;
import java.awt.*;

// 3) Now in your class (which extends JFrame)
public class JFrameTrial extends JFrame {

    public static void main(String[] args) {
        MousePos = new Point(0, 0);

        JFrameTrial jft = new JFrameTrial();
        jft.setDefaultCloseOperation(EXIT_ON_CLOSE);
        jft.setSize(300, 300);
        jft.setVisible(true);

    }

    public JFrameTrial() {
        /* 4) set the contentPane using setContentPane
        as the class you just created extending JComponent.*/
        jct = new JComponentTrial(150, 150);
        setContentPane(jct);

        addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseMoved(MouseEvent e) {
                MousePos = e.getPoint();
                getContentPane().repaint();
            }
        });
    }
    private JComponentTrial jct;
    private static Point MousePos;

    // 1) But what you have to do is create a class which extends JComponent.
    private class JComponentTrial extends JComponent {

        public JComponentTrial(int x, int y) {
            setSize(x, y);
        }

        // 2)There override the paintComponent() method with whatever you want to draw.
        @Override
        public void paintComponent(Graphics g) {
            Graphics gg = g.create();
            gg.setColor(Color.red);
            gg.drawRect((int) MousePos.getX() - 15,
                    (int) MousePos.getY() - 15, 30, 30);
            gg.dispose();
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 02 июля 2011

Несколько предложений:

  • Рисование в классе, расширяющем JPanel или JComponent, а не JFrame.
  • Рисование в переопределенном методе paintComponent, а не в методе рисования.
  • Первая строка вашего метода paintComponent должна быть вызовом super.paintComponent(g);
  • Не распоряжаться объектом Graphics, переданным вам в параметре paintComponent (или paint).Утилизируйте только созданные вами объекты Graphics или Graphics2D.
1 голос
/ 02 июля 2011

Для Swing вам нужно переопределить paintComponent(), а не paint().Вы рисуете прямо на контейнере верхнего уровня.Рассмотрите возможность использования JPanel.переопределить paintComponent JPanel.

РЕДАКТИРОВАТЬ

После прочтения вашего отзыва, я думаю, что вам нужно сделать следующее:

Во-первых, несколько моментов, которые следует запомнить:

  1. JFrame не является подклассом JComponent.Так что он не имеет paintComponent (). И рисовать не следует с Swing.Так что вам нужно сделать что-то другое.

  2. Как и все контейнеры верхнего уровня, JFrame также определяет количество панелей, в верхней части которых находится JRootPane .JRootPane.до glass pane, content pane и layered pane.Обычно мы просто создаем класс, который расширяет такой компонент, как JPanel.В этом классе мы переопределяем метод paintComponent(), и вот как мы рисуем вещи. Затем мы просто добавляем его в панель содержимого JFrame.

Но что вам нужно сделать?создать класс, который расширяет JComponent.Там переопределите метод paintComponent () всем, что вы хотите нарисовать.Теперь в вашем классе (который расширяет JFrame) установите contentPane, используя setContentPane как класс, который вы только что создали, расширяющий JComponent.Структура setContentPane имеет вид

public void setContentPane(Container contentPane)

Таким образом, вы можете передать объект класса, который расширяет JComponent, поскольку JComponent является подклассом контейнера.

Что вы сделалипросто установить макет панели содержимого после использования getContentPane.Но вам также нужно настроить его так, чтобы он вел себя так, как вы этого хотите.Обычно мы этого не делаем, потому что добавляем компоненты на панель контента напрямую, используя add().Я надеюсь, что это сработает.

...