如何在Java Swing中使用重绘方法

时间:2015-10-30 17:34:39

标签: java swing repaint mouselistener swingx

我是Java的Graphics部分的新手。我已经创建了一个框架,并在其上添加了一个颜色已设置为绿色的面板。现在,在点击该面板时,我想使用名为Mypanel的测试类对象绘制一个圆圈。但它不会发生。请指导!

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

class Mypanel extends JPanel
{
    @Override
    public void paintComponent(Graphics g)
    {
        g.drawOval(15, 15, 5, 5);
    }        
}
public class algo extends javax.swing.JFrame {

    public algo() {
        initComponents();
        jPanel1.setBackground(Color.GREEN);
    }
    Mypanel p = new Mypanel() ;

    private void jPanel1MouseClicked(java.awt.event.MouseEvent evt) {                                     
        p.repaint();
    }                                    

    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new algo().setVisible(true);
            }
        });
    }

}

如果我猜我会说我不应该使用重绘方法,但我被告知要使用它。

2 个答案:

答案 0 :(得分:1)

提供的代码无法编译。为了更好地提供帮助,请发布Minimal, Complete, and Verifiable exampleShort, Self Contained, Correct Example

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Mypanel extends JPanel {

    boolean clicked = false;

    Mypanel() {
        setBackground(Color.GREEN);
        MouseListener mouseListener = new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                clicked = true;
                repaint();
            }
        };
        this.addMouseListener(mouseListener);
    }

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

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (clicked) {
            g.drawOval(15, 15, 50, 50);
        }
    }
}

public class algo extends JFrame {

    public algo() {
        initComponents();
        pack();
        //jPanel1.setBackground(Color.GREEN); ?!?
    }

    protected final void initComponents() {
        add(new Mypanel());
    }

    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new algo().setVisible(true);
            }
        });
    }
}

答案 1 :(得分:-2)

在你的例子中有一些事情需要纠正......

当你创建框架(即在构造函数中)时,你想要调用super()。这是构造函数必须做的第一件事。然后,您可能想要设置初始宽度/高度,并将框架的背景颜色设置为绿色。

您需要添加一个鼠标侦听器,以便实际调用mouseClicked方法。然后让它添加' MyPanel'对象到框架,并调用重绘。

我认为这大致是你的目标。