Стойкость нарисованного объекта на JPanel - PullRequest
0 голосов
/ 19 марта 2012

Привет, Эксперты: у меня есть класс, который расширяет JPanel, теперь ShapePanel (Sp) добавляется к обычному JPanel (Контейнеру), который inturn добавляется в JFrame (Окно).В методе paintComponent я рисую форму .... но форма никогда не сохраняется после рендеринга.В отладчике я вижу, что он перерисовывается каждый раз, когда я изменяю размер или что-то в этом роде.

Теперь я перегружен компонентом JPanel (Sp's) paintComponent и добавил

    super.paintComponent(g);        

    ShapeDrawerGui SdG = new ShapeDrawerGui((Graphics2D)this.getGraphics());
    //for(Shape s : ArrayOfShapes)
    {
        if(s instanceof Rectangle)
                SdG.Paint((Rectangle)s);
            else if(s instanceof Triangle)
                SdG.Paint((Triangle)s);
            else
                SdG.Paint((Circle)s);
    } //s is a custom-shape object

графикуобъект исходит (очевидно) из JPanel ....

Но нарисованное изображение никогда не остается на панели - вы видите его на долю секунды, и оно исчезло ...

Я сделалнекоторые ищут, но безрезультатно.

Фактический рисунок

public ShapeDrawerGui(Graphics2D _g)
{
    g = _g;
    g.setColor(Color.Black);
}

@Override
public void Paint(Circle c) 
{
    g.drawArc(0, 0, 50, 50, 0, 360);
}

@Override
public void Paint(Triangle t) 
{        
    Polygon p = new Polygon();
    p.addPoint(0, 25);
    p.addPoint(0 , 50);
    p.addPoint(50, 50);       
    g.drawPolygon(p);
}

@Override
public void Paint(Rectangle r) 
{
    g.drawRect(0, 0, 50, 50);
}

С уважением

Маркус

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

.. в чем разница между this.getGraphics и g ..?

Графический интерфейс должен перекрашиваться, когда ему говорят об этом, и использовать объект Graphicsпоставляется по методу paint(Graphics) или paintComponent(Graphics).Этот метод может быть вызван GUI в любое время, например, для перекраски после того, как он находится за другим окном.

Когда вы вызываете getGraphics(), вам предоставляется непостоянный графический объект, который будетисчезнет следующая краска.

1 голос
/ 14 июня 2014

Вот проблема:

super.paintComponent(g);        

ShapeDrawerGui SdG = new ShapeDrawerGui((Graphics2D)this.getGraphics());

g и SdG - это два разных объекта, и нелогично, g, принадлежащий вашей специализированной панели, НЕ тот, который всегда рисует на ней.

В зависимости от того, что делает ваша программа, они могут ОБА использоваться для рисования на холст, однако g всегда будет отрисовываться последним и сохраняться после завершения рисования SgD. даже если Graphics2D, который вы получили SgD ДОЛЖЕН принадлежать компоненту, в который вы хотите рисовать, (getGraphics()), это не означает, что для рисования холста используется Графика.

Я знаю, что это нелогично. У каждого jJXXX есть связанный объект Graphics, который используется для рисования, но это не значит, что он будет использоваться Swing для рисования, несмотря ни на что.

Графика, поступающая к вам через параметр в paintComponent, НЕ является той же графикой, что вы получаете из getGraphics(), даже если paintComponent() - это метод для того же объекта, на котором вы вызываете getGraphics.

Если вы хотите увидеть это, просто установите логическое значение для первой строки этого оператора в paintComponent(Graphics g):

boolean sameObject = (g== getGraphics())

и распечатайте sameObject. Вы увидите слово false.

Так что оба используются для рисования на экране. Вы видите это, потому что в это время ваш холст g делает рисунок. Затем, через микросекунду, g, который вы получаете в качестве параметра, рисует, и он рисует в последнюю очередь.

Тот, кто рисует последние, побеждает. Это своего рода обратное противостояние.

...