自定义JPanel不更新

时间:2015-10-14 11:19:00

标签: java swing jpanel java-2d

代码:

import java.awt.BorderLayout;

import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PaintWindow {

private JFrame frame;
private aJPanel panel;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                PaintWindow window = new PaintWindow();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public PaintWindow() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel = new aJPanel();
    frame.getContentPane().add(panel, BorderLayout.CENTER);

    JButton btnNewButton = new JButton("New button");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            panel.stam();
        }
    });
    frame.getContentPane().add(btnNewButton, BorderLayout.NORTH);

    frame.setBounds(100, 100, 450, 300);
    frame.setVisible(true);
}

public class aJPanel extends JPanel {
    private static final long serialVersionUID = 8874943072526915834L;
    private Graphics g;

    public aJPanel() {
        super();
        System.out.println("Constructor");
    }

    public void paint(Graphics g) {
        super.paint(g);
        System.out.println("paint");
        g.fillRect(10, 10, 10, 10);
        this.g = g;

    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        System.out.println("paintComponent");
        g.fillRect(20, 20, 20, 20);
        this.g = g;
    }

    public void stam() {
        System.out.println("stam");
        this.g.fillRect(40, 40, 40, 40);
        this.repaint();
    }
}
}

我想要做的是在用户点击按钮或触发鼠标事件后绘制自定义形状(线条,矩形等)。但是调用aJPanel.stam()并没有显示它应该的矩形。我是JPanel的新手。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

首先:

  1. 班级名称应以大写字母开头
  2. 类名应该是描述性的。
  3. “aJPanel”不遵循上述任何一种。

      

    但是调用aJPanel.stam()不会显示它应该为

    的矩形

    有关动态绘画的两种常用方法,请参阅Custom Painting Apporoaches

    1. 将对象添加到List并迭代List以绘制所有对象
    2. 直接绘制到BufferedImage,然后绘制BufferedImage
    3. 示例通过拖动鼠标添加Rectangle,但只需在单击按钮时调用addRectangle(...)方法即可轻松添加矩形。