Показать проблемы с холстом - PullRequest
0 голосов
/ 16 сентября 2018

В настоящее время я пытаюсь получить JFrame, который содержит два компонента JPanel - первый компонент JPanel предназначен для хранения различных кнопок, которые пользователь может нажимать для взаимодействия с программой и рисования изображений на экране. , Второй, и именно здесь начинается проблема, содержит фактический Canvas объект, к которому я пытаюсь обратиться.

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

В качестве теста я просто пытаюсь нанести fillRect() на панель рисования, но безрезультатно. Вот мой код:

// Создание компонентов и JFrame:

    public static void createDisplay() {

        JFrame f = new JFrame();//When JFrame flowlayout manager removed, the rectangle was drawn.
        c = new Canvas();

        width = 500;
        height = 500;

        f.setLayout(new FlowLayout());

        f.add(addButtons()); //private method that covers the button panel

        JPanel drawPanel = new JPanel();


        drawPanel.add(c);

        c.setFocusable(false);

        f.add(drawPanel);

        f.setPreferredSize(new Dimension(height, width));

        lstnr = new Listeners();

        f.addKeyListener(lstnr);
        f.addMouseListener(lstnr);
        f.addMouseMotionListener(lstnr);

        f.setLocationRelativeTo(null);

        f.pack();
        f.setVisible(true);


}

И код, который выполняет фактическое рисование на экране:

private void render() {

    bs = c.getBufferStrategy();

    if(bs == null) {
        c.createBufferStrategy(3);
        return;
    }


    do {
        do {
            g = bs.getDrawGraphics();
            l.setGraphicsObj(g);
            g.clearRect(0, 0, width, height);

            for(Symbols s : l.getSymbolsArray());

                s.renderSymbols();
            }
            g.fillRect(0, 0, 50, 50); //Just to test & make sure it works

            g.dispose();

        }while(bs.contentsRestored());

        bs.show();
    }while(bs.contentsLost());

}

Теперь я хотел бы еще раз подчеркнуть, что прямоугольник был нарисован , когда я удалил фрагмент f.setLayoutManager(new FlowLayout()); из метода createDisplay(). Любая помощь очень ценится.

1 Ответ

0 голосов
/ 16 сентября 2018
  1. У вас конфликтующие системы рисования. Один использовался для рисования BufferStrategy, а второй использовался Swing для рисования его компонентов
  2. Смешивание тяжелых и легких компонентов проблематично в лучшие времена, вы должны сделать все возможное, чтобы уменьшить перекрытие
  3. A Canvas имеет предпочтительный размер по умолчанию 0x0, который FlowLayout будет использовать для определения наилучшего расположения

«Возможное» решение может заключаться в том, чтобы сосредоточить внимание на размещении Canvas в его собственном месте и отделить элементы Swing.

Вы все еще сталкиваетесь с миром проблем, поскольку вам нужно будет управлять данными между двумя различными контекстами потоков

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.image.BufferStrategy;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                PaintPane paintPane = new PaintPane();

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new ButtonPane(), BorderLayout.WEST);
                frame.add(paintPane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                paintPane.start();
            }
        });
    }

    public class ButtonPane extends JPanel {

        public ButtonPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.weightx = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            for (int index =0; index < 5; index++) {
                add(new JButton(Integer.toString(index)), gbc);
            }
        }

    }

    public class PaintPane extends Canvas {

        private Thread renderThread;
        private AtomicBoolean running = new AtomicBoolean(true);

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        public void start() {
            if (renderThread != null) {
                return;
            }

            running.set(true);
            renderThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    while (running.get()) {
                        render();
                        try {
                            Thread.sleep(5);
                        } catch (InterruptedException ex) {
                        }
                    }
                }
            });
            renderThread.start();
        }

        public void stop() {
            if (renderThread != null) {
                return;
            }
            running.set(false);
            renderThread.interrupt();
            try {
                renderThread.join();
            } catch (InterruptedException ex) {
            }
            renderThread = null;
        }

        protected void render() {
            BufferStrategy bs = getBufferStrategy();

            if (bs == null) {
                createBufferStrategy(3);
                return;
            }

            do {
                do {
                    Graphics g = bs.getDrawGraphics();
                    // :/
                    //l.setGraphicsObj(g);
                    g.clearRect(0, 0, getWidth(), getHeight());

                    //for (Symbols s : l.getSymbolsArray()) {
                    //  // This is where g should be passed
                    //  s.renderSymbols();
                    //}
                    g.setColor(Color.BLUE);
                    g.fillRect(0, 0, 50, 50); //Just to test & make sure it works
                    g.dispose();
                } while (bs.contentsRestored());
                bs.show();
            } while (bs.contentsLost());
        }

    }

}
...