【问题标题】:How to use the repaint method in Java Swing如何在 Java Swing 中使用 repaint 方法
【发布时间】:2015-10-30 17:34:38
【问题描述】:

我对 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);
            }
        });
    }

}

如果我猜的话,我会说我不应该使用 repaint 方法,但有人告诉我这是要使用的。

【问题讨论】:

  • 在我看来,当你改变结构时,你需要重新绘制,即椭圆形到方形或类似的。在大多数情况下,组件更改会自动反映。当您调用特定属性的 setter 方法时。
  • 无法确定,因为您的问题中没有包含 initComponents() 方法,但可能的原因是您的 Mypanel 实例的宽度为零,高度为零。您可以通过在 Mypanel 类中覆盖 getPreferredSize() 来解决此问题。此外,被覆盖的paintComponent 方法的第一行应始终为super.paintComponent(g);。如果你不这样做,你会看到奇怪的行为。
  • 根据您的代码,我相信您是一名 C# 程序员,对吧?在 Java 中,仅使用您的对象名称和后缀 MouseClicked 创建一个方法根本不会向您的对象添加事件。我建议你先学习更多关于 Java、事件、命名约定的知识,然后再重写你的代码 =)

标签: java swing repaint mouselistener swingx


【解决方案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);
            }
        });
    }
}

【讨论】:

    【解决方案2】:

    在您的示例中有几处需要更正...

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

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

    我想这大致就是你想要的。

    【讨论】:

    • “我认为这大致就是你想要的。”我认为你应该在公开发表想法之前测试它们。 “您可能需要设置初始宽度/高度” 不,组件(包括 Mypanel 等自定义组件应覆盖 getPreferredSize 以返回合理值,然后应打包框架到那个大小。“然后让它添加 'MyPanel' 对象到框架,并调用 repaint。” 最好在启动时将面板添加到框架,然后简单地改变它的状态(和单击按钮时调用repaint()
    • 没有理由写super()。如果不存在对不同构造函数的调用,则始终自动调用它。
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 2015-05-13
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2013-12-13
    相关资源
    最近更新 更多