Автоматический перекрас JPanel - PullRequest
1 голос
/ 24 августа 2011

В моем графическом интерфейсе, который я создал на Java, каждый раз, когда я минимизирую окно, вызывается перекраска, и чертеж, который был там, исчезает после того, как окно развернуто (обратно в нормальное состояние)

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

Вот что у меня есть:

    //Redraw plot if window is minimized
    window.addWindowStateListener(new WindowAdapter()
    {
        Graphics g = dPanel.getGraphics();

        public void windowStateChanged(WindowEvent ev) 
        {
            boolean minimized = false;

            //If user minimizes window and then maximizes window
            if(window.getExtendedState() == Frame.ICONIFIED )
            {
                minimized = true;
                System.out.println("Window minimized");
            }

            if(ev.getNewState() == Frame.NORMAL || minimized == true)
            {

                System.out.println("Window back to normal state");

                //Draw each Point back onto the screen
                for(Point i: PointArray)
                {
                    drawPoint(g, i, startColor); 
                    System.out.println("Panel Repaint");
                }
            }
        }
    });
}

Есть ли способ, которым мой код может быть отредактирован для достижения желаемых результатов, или есть лучший способ сделать это. По сути, я просто хочу, чтобы, когда пользователь свернул GUI, рисунок, который был там до минимизации, все еще там, когда пользователь развернет окно до максимума. Кроме того, перемещение окна может также привести к перекрашиванию частей панели или перекрашиванию всей панели.

    //Draws point onto panel
public void drawPoint(Graphics g, Point PointArray, Color color)
{
    Graphics2D g2d = (Graphics2D)g;
    g2d.setStroke(new BasicStroke(2f));
    g.setColor(color); //g2d.setColor(Color.black); 
    g2d.drawOval((int)PointArray.a, (int)PointArray.b, 2, 2);
}  

Ответы [ 3 ]

4 голосов
/ 24 августа 2011

Чем больше я читаю о вашей ситуации и потребностях, тем больше я думаю, что вы на самом деле должны использовать getGraphics, но не вызывайте это для JComponent, такого как JPanel.Скорее вы должны сделать свой рисунок в BufferedImage, и вы должны получить графический объект BufferedImage, вызвав getGraphics для BufferedImage.Затем вы можете нарисовать этот BufferedImage в методе JComponent paintComponent с помощью метода Graphics # drawImage (...), или даже еще лучше для его простоты (и если вы не хотите использовать изображение в качестве фона для JPanel или графического интерфейса пользователя)нарисуйте изображение в ImageIcon, которое отображается в JLabel.Однако одно предостережение заключается в том, что если вы получаете объект Graphics этим способом, не забудьте утилизировать его, когда закончите.

3 голосов
/ 24 августа 2011

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

Вы даже поблагодарили меня за предложения.

Поэтому попробуйте реализовать предложение ПЕРЕД размещением последующего вопроса.

0 голосов
/ 16 января 2013

Я только что нашел способ заставить перекрасить JPanel и все его компоненты.Вместо выполнения какой-либо специальной работы просто позвоните своему JPanels.setVisible(false), а затем setVisible(true).Это перерисовает все!Вы не увидите мерцания, как волшебство.

...