在Netbeans GUI构建器中使用canvas

时间:2014-06-21 09:14:46

标签: java

我试图在java中使用canvas。我使用netbeans GUI构建器向窗口添加了几个画布,但我不确定如何在它们上绘制线条或矩形。我读过几本手册如何做到这一点,但我还是初学Java,我不太明白我应该做什么。该类的构造函数如下所示:

public Classname() {
        initComponents();
  canvas1.setBackground(Color.red); // That works.
// Now I want to (for example) draw a line on the canvas1 (or some other canvas)
    }

有人可以解释一下我应该写什么代码以及放在哪里?提前致谢。 (抱歉我的英文。)

1 个答案:

答案 0 :(得分:2)

假设您的意思是java.awt.Canvas,我建议您不要使用它。有两个主要原因,一个是重量级组件,它在与Swing /轻量级组件混合时引入了一系列问题,而且它们不是双缓冲的,这只会增加您需要处理的额外开销。

执行自定义绘制的首选方法是通常创建一个从JPanel扩展的新类,并覆盖它的paintComponent方法,例如

public class PaintPane extends JPanel {

    public PaintPane () {
    }

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

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2);
        g2d.dispose();
    }

}

这会在面板中间绘制一条简单的线条。

然后,您可以将类从“项目”选项卡拖到表单编辑器(以及现有表单容器),就像使用调色板中的组件一样

请查看Performing Custom Painting2D Graphics了解详情

根据评论更新了示例

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class DrawExample {

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

    private DrawPane drawPane;

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

                drawPane = new DrawPane();
                JButton addRect = new JButton("Add Rectangle");
                addRect.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {

                        int width = drawPane.getWidth() - 1;
                        int height = drawPane.getHeight() - 1;

                        int x = (int)(Math.random() * (width - 5));
                        int y = (int)(Math.random() * (height - 5));

                        width -= x;
                        height -= y;
                        int rectWidth = (int)(Math.random() * width);
                        int rectHeight = (int)(Math.random() * height / 2);

                        drawPane.addRect(x, y, rectWidth, rectHeight);
                    }
                });

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(drawPane);
                frame.add(addRect, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class DrawPane extends JPanel {

        private List<Shape> shapes;

        public DrawPane() {
            shapes = new ArrayList<Shape>(25);
        }

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            for (Shape shape : shapes) {
                g2d.draw(shape);
            }
            g2d.dispose();
        }

        public void addRect(int x, int y, int width, int height) {

            shapes.add(new Rectangle(x, y, width, height));
            repaint();

        }
    }

}