如何在JavaSwing中使用重绘方法

如何在JavaSwing中使用重绘方法,java,swing,repaint,mouselistener,swingx,Java,Swing,Repaint,Mouselistener,Swingx,我对Java的图形部分非常陌生。我已经创建了一个框架,并在其上添加了一个面板,其颜色已设置为绿色。现在单击该面板,我想使用一个名为Mypanel的测试类对象绘制一个圆。但事实并非如此。请导游 import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; class Mypanel extends JPanel { @Override public void paintComponent(G

我对Java的图形部分非常陌生。我已经创建了一个框架,并在其上添加了一个面板,其颜色已设置为绿色。现在单击该面板,我想使用一个名为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);
            }
        });
    }

}

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

在您的示例中,有几件事需要更正

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

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


我想这大概就是您想要的。

提供的代码无法编译。为了更快地获得更好的帮助,请发布一个or


在我看来,当你改变结构时,你需要重新油漆,即椭圆形到正方形或类似的。在swing中,大部分时间组件更改都会自动反映出来。当您调用特定属性的setter方法时。这是不可能确定的,因为您的问题中没有包含
initComponents()
方法,但一个可能的原因是
Mypanel
实例的宽度为零,高度为零。可以通过在Mypanel类中重写来修复此问题。此外,重写的paintComponent方法中的第一行应该始终是
super.paintComponent(g)。如果你不这样做,你会看到奇怪的行为。根据你的代码,我相信你是一个C#程序员,对吗?在Java中,仅使用对象名和sufix
MouseClicked
创建一个方法根本不会向对象添加事件。我建议您在编写代码之前多学习Java、事件、命名转换,然后重写代码=)“我想这大概就是您要做的。”我认为您应该在公开编写想法之前对其进行测试。“您可能需要设置初始宽度/高度”否,组件(包括自定义组件,如
Mypanel
应覆盖
getPreferredSize
以返回合理的值,然后框架应打包为该大小。“然后让它将'Mypanel'对象添加到框架中,并调用repaint。”最好在启动时将面板添加到框架中,然后简单地更改其状态(并在单击按钮时调用
repaint()
。没有理由写入
super()
。如果没有调用其他构造函数,则始终会自动调用它。
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);
            }
        });
    }
}