Swing: графика исчезла после сворачивания окна - PullRequest
0 голосов
/ 07 июля 2019

У меня есть класс Swing, который генерирует некоторую графику и 2 кнопки.Код предоставлен.

import java.awt.Color;

import java.awt.Graphics;
import java.util.Random;

import javax.swing.*;

import static javax.swing.JFrame.EXIT_ON_CLOSE;

public class GraphicsDemo_noborders_ML {


    /* GoKart Colors
    String color1 = "#000000";
    String color2 = "#66CCCC";
    String color3 = "#B7D108";
    String color4 = "#E61E3F";
    String color5 = "#FBEC52";
    String color6 = "#9973AD";
    String color7 = "#F9A226";
    String color8 = "#6299EB";
    String colorBG= "#ffffff";
    */


    /* GoKart Colors
    String color1 = "#000000";
    String color2 = "#ff6672";
    String color3 = "#B7D999";
    String color4 = "#E61999";
    String color5 = "#FBEC52";
    String color6 = "#997999";
    String color7 = "#F9A226";
    String color8 = "#6299EB";
    String colorBG= "#ffffff";
    */


    /* Blue Corn
    String color1 = "#344152";
    String color2 = "#344152";
    String color3 = "#344152";
    String color4 = "#344152";
    String color5 = "#344152";
    String color6 = "#344152";
    String color7 = "#344152";
    String color8 = "#344152";
    String colorBG= "#ffffff";
    */

    /* White
    String color1 = "#ffffff";
    String color2 = "#ffffff";
    String color3 = "#ffffff";
    String color4 = "#ffffff";
    String color5 = "#ffffff";
    String color6 = "#ffffff";
    String color7 = "#ffffff";
    String color8 = "#ffffff";
    String colorBG= "#000000";
    */


    private static final long serialVersionUID = 1L;

    int sizeBig = 150;
    final static int canvasW = 1300;
    final static int canvasH = 750;

    int initialS = 1;
    int numberS = 40;
    int smallsizeVAR = sizeBig / 3;
    int border1 = 0;

    Random rand;


    /* Black  */
    String color1 = "#000000";
    String color2 = "#000000";
    String color3 = "#000000";
    String color4 = "#000000";
    String color5 = "#000000";
    String color6 = "#000000";
    String color7 = "#000000";
    String color8 = "#000000";
    String colorBG = "#ffffff";


    public GraphicsDemo_noborders_ML() {

        rand = new Random();
    }

    public void paint(final Graphics g) {

        g.setColor(Color.decode(colorBG));
        g.fillRect(0, 0, canvasW, canvasH);

        while (initialS <= numberS) {

            final int randX = rand.nextInt(canvasW + sizeBig) + (0 - sizeBig);
            final int randY = rand.nextInt(canvasH + sizeBig) + (0 - sizeBig);

            final int sizeRANDx = rand.nextInt(((sizeBig + 1) - smallsizeVAR) + 1) + smallsizeVAR;
            final int sizeRANDy = sizeRANDx;


            final String[] arr = {color2, color3, color4, color5, color6, color7, color8};
            final Random random = new Random();
            final int select = random.nextInt(arr.length);

            g.setColor(Color.decode(arr[select]));
            g.fillRect(randX, randY, sizeRANDx, sizeRANDy);


            if (sizeRANDx > sizeRANDy) {
                border1 = (sizeRANDx - ((4 * sizeRANDx) / 5)) / 2;
            } else {
                border1 = (sizeRANDy - ((4 * sizeRANDy) / 5)) / 2;
            }

            g.setColor(Color.decode(colorBG));
            g.fillRect(randX + border1, randY + border1, sizeRANDx - (2 * border1), sizeRANDy - (2 * border1));

            initialS++;

            if (initialS == numberS + 1) {

                g.setColor(Color.decode(arr[select]));
                g.fillRect(canvasW / 8, canvasW / 8, (3 * sizeBig) / 2, (3 * sizeBig) / 2);
            }
        }
    }


    public static void main(final String args[]) {

        SwingUtilities.invokeLater(new Runnable() {

            public void run() {

                final GraphicsDemo_noborders_ML demo = new GraphicsDemo_noborders_ML();

                JFrame jFrame = new JFrame();

                jFrame.setTitle("Latest Programic Art");
                jFrame.setSize(canvasW, canvasH);

                JButton save = new JButton("Save");
                JButton run = new JButton("Run Again");

                save.setBounds(50, 100, 100, 50);
                run.setBounds(50, 500, 100, 50);

                JPanel panel = new JPanel();

                panel.add(save);
                panel.add(run);

                JComponent canvas = new JComponent() {

                    @Override
                    protected void paintComponent(Graphics g) {
                        demo.paint(g);
                    }
                };

                jFrame.getContentPane().add(panel);
                jFrame.getContentPane().add(canvas);

                jFrame.setVisible(true);
                jFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
            }
        });
    }
}

Графика генерируется нормально, но когда я минимизирую окно, все исчезает. Во-вторых, я не могу видеть кнопки, но если я предоставляю порядок добавлениянаоборот,

            jFrame.getContentPane().add(canvas);
            jFrame.getContentPane().add(panel);

Я вижу кнопки, но не рисунки.

Как мне исправить код?

1 Ответ

1 голос
/ 07 июля 2019
    while (initialS <= numberS) {

Метод paintComponent () вызывается всякий раз, когда Swing определяет, что компонент необходимо перекрасить.Например, когда вы восстанавливаете фрейм, вызывается метод paintComponent ().

В вашем случае вы не сбрасываете переменную «initialS» в 0, поэтому цикл никогда не будет выполнен во второй раз.Поэтому вам нужно сбросить переменную перед входом в цикл.

save.setBounds(50, 100, 100, 50);
run.setBounds(50, 500, 100, 50);

JPanel panel = new JPanel();

panel.add(save);
panel.add(run);

setBounds (...) ничего не делает.Вы добавляете компоненты в JPanel.По умолчанию JPanel использует FlowLayout.Менеджер по расположению сбросит границы на основе правил менеджера по расположению.

Не пытайтесь устанавливать границы.Пусть менеджер раскладки выполнит свою работу.

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

Макет по умолчаниюМенеджер для JFrame - BorderLayout.Когда вы не указываете ограничение, компонент добавляется в ЦЕНТР.Проблема в том, что вы можете добавить только один компонент в ЦЕНТР, поэтому виден только последний добавленный.

Вместо этого попробуйте:

jFrame.getContentPane().add(canvas, BorderLayout.CENTER);
jFrame.getContentPane().add(panel, BorderLayout.PAGE_START);

, чтобы увидеть оба компонента.

Кроме того, обычно вы бы:

  1. добавили пользовательский код рисования непосредственно в метод paintComponent () компонента, чтобы сохранить всю логику в одном месте
  2. переопределить getPreferredSize()метод, позволяющий вернуть размер компонента, чтобы менеджеры компоновки могли работать должным образом.

Прочтите раздел из учебника Swing по Custom Painting для получения дополнительной информации и рабочих примеров.

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