用帆布显示麻烦

问题描述 投票:1回答:1

目前我正在尝试拥有一个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()片段时绘制了矩形。任何帮助深表感谢。

java graphics awt
1个回答
1
投票
  1. 你有相互冲突的绘画系统。一个用于绘制BufferStrategy和Swing用于绘制它的组件的那个
  2. 混合重量和重量轻的组件在最好的情况下是有问题的,你应该尽一切可能减少重叠
  3. 一个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());
        }

    }

}
© www.soinside.com 2019 - 2024. All rights reserved.