JPanel绘图 - 为什么我必须覆盖paintComponent方法?

时间:2015-05-18 10:34:47

标签: java swing jpanel drawing

我正在学习Java,我已经开始尝试绘图了。

基本上我有两个问题:

  1. 为什么我必须覆盖paintCompoment方法才能在JPanel上绘制内容?
  2. 考虑到我调用f.add(new MyPanel());时的第一个示例,它会创建一个新的MyPanel对象并绘制文本。为什么要绘制文字?方法paintComponent(g)未被调用。
  3. 对我来说,我有两个选择:

    第一个(来自http://docs.oracle.com/javase/tutorial/uiswing/painting/step2.html):

    package painting;
    
    import javax.swing.SwingUtilities;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.BorderFactory;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    
    public class SwingPaintDemo2 {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI(); 
                }
            });
        }
    
        private static void createAndShowGUI() {
            System.out.println("Created GUI on EDT? "+
            SwingUtilities.isEventDispatchThread());
            JFrame f = new JFrame("Swing Paint Demo");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(new MyPanel());
            f.pack();
            f.setVisible(true);
        }
    }
    
    class MyPanel extends JPanel {
    
        public MyPanel() {
            setBorder(BorderFactory.createLineBorder(Color.black));
        }
    
        public Dimension getPreferredSize() {
            return new Dimension(250,200);
        }
    
        public void paintComponent(Graphics g) {
            super.paintComponent(g);       
    
            // Draw Text
            g.drawString("This is my custom Panel!",10,20);
        }  
    }
    

    第二个:也适用

    Graphics g = panel.getGraphics();
    g.setColor(new Color(255, 0, 0));
    g.drawString("Hello", 200, 200);
    g.draw3DRect(10, 20, 50, 15, true);
    panel.paintComponents(g);
    

1 个答案:

答案 0 :(得分:2)

您不应该自己致电paintComponent()

自动调用paintComponent()(由UI线程)。

如果将paintComponent()方法留空,则会调用它,但不会绘制任何内容,因为它是空的。

相关问题