为什么JAVA Graphics不会画画

时间:2014-09-19 09:33:26

标签: java swing graphics jpanel 2d

我是JAVA的初学者,我对以下问题感到不满:

为什么此代码无法绘制

import ...

public class tekening extends JFrame{

    private JPanel p;
    private Graphics g;

    tekening(){

        setLayout(new FlowLayout());

        p = new JPanel();
        p.setPreferredSize(new Dimension(350, 350));
        p.setBackground(Color.WHITE);
        add(p);

        setLocationByPlatform(true);
        setSize(400, 400); 
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE); 

        g = p.getGraphics();
        g.setColor(Color.BLACK);
        g.drawRect(30, 30, 80, 40);
        g.drawLine(10, 10, 40, 50);
    }

}

为什么这段代码会吸引

import ...

public class tekenclasse extends JFrame implements ActionListener{

    private JPanel p;
    private Graphics g;
    private JButton button1;

    tekenclasse(){

        setLayout(new FlowLayout());

        button1 = new JButton("Knop 1");
        button1.addActionListener(this);
        add(button1);

        p = new JPanel();
        p.setPreferredSize(new Dimension(350, 350));
        p.setBackground(Color.WHITE);
        add(p);

        setLocationByPlatform(true);
        setSize(400, 400); 
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
    }

    public void actionPerformed(ActionEvent e){
        g = p.getGraphics();
        g.setColor(Color.BLACK);
        g.drawRect(30, 30, 80, 40);
        g.drawLine(10, 10, 40, 50);
    }

}

对我来说,这完全是奇怪的。为什么我不能在构造函数中使用Graphics。为什么我可以在活动结束后使用它。这是愚蠢的我想立即画画,我不想按一个按钮。

1 个答案:

答案 0 :(得分:3)

  1. 切勿使用getGraphics()进行绘画。

  2. 请勿尝试在JFrame

  3. 等顶级容器上绘画
  4. 相反(如Performing Custom Painting - 必须阅读),使用JPanel(或JComponent)并覆盖其protected void paintComponent(Graphics g)方法。使用该图形上下文来进行绘画。所有绘画都应该在图形上下文提供的范围内完成,无论是直接在paintComponent方法中编写代码,还是调用将Graphics对象作为参数传递给它的方法。

    < / LI>
  5. 覆盖public Dimension getPreferredSize()中的JPanel/JComponent,为您提供绘画表面的首选尺寸。将pabel添加到框架,然后pack()框架。

    public class DrawPanel extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.draw...  // do all your drawing here
        }
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }
    }
    
  6. 重要提示:在发布有关绘画的其他问题之前,您必须阅读有关自定义绘画的链接,否则您将获得打屁股:-)