java - 如何从Java中的多个方法中进行绘制?

标签 java swing graphics drawing graphics2d

好吧,所以我正在尝试制作一个笑脸程序,当它第一次启动时,它应该显示默认的笑脸(这部分有效,我猜它很棒)

但是它应该给你两个按钮来选择微笑和皱眉按钮,这两个按钮应该重新绘制面孔以显示微笑或皱眉,但由于某种原因它不起作用。

我一直在阅读有关图形的内容,我知道你不应该从 Paint() 方法之外调用它们,所以我相应地更改了我的代码,我可以告诉按钮正在工作,因为我让它们打印出每个按钮的内容时间,但实际的重绘不起作用。我也尝试过使用 repaint() 和 revalidate() 。出于某种原因,如果您使用 repaint() 它每次都会重新绘制越来越多的内容,这很奇怪,但也许它应该是这样的?

有人可以看一下代码,让我知道你认为问题是什么,或者我应该在哪里寻找解决方案我已经使用java一段时间了,但我从不使用图形:/我读过你应该在最后使用 setVisible/setSize(or pack()) ,这实际上有助于解决我之前遇到的一些问题,但当你想绘制多个东西时我不知道该怎么做,大多数例子只显示绘制一个东西。

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class JSmileFacePanel2 extends JFrame {

/**
 * 
 */
private static final long serialVersionUID = 1L;

JButton smile = new JButton("SMILE");
JButton frown = new JButton("FROWN");

public JSmileFacePanel2() {
    setLayout(new FlowLayout());
    setTitle("JSmileFace-V2: Jose M. Tobar");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    add(frown);
    add(smile);

    setSize(800, 800);
    setVisible(true);
}

public void paint(Graphics g) {
    super.paint(g);
    //by default should show smiling
    g.setColor(Color.YELLOW);
    g.fillOval(200, 200, 500, 500);
    g.setColor(Color.BLUE);
    g.fillOval(300, 360, 50, 50);
    g.setColor(Color.BLUE);
    g.fillOval(600, 360, 50, 50);
    g.drawArc(400, 400, 100, 40, 180, 185);

    smile.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("SMILE BUTTON CLICKED");
            drawSmile(g);

        }
    });

    frown.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("FROWN BUTTON CLICKED");
            drawFrown(g);
        }
    });
}

public void drawSmile(Graphics g) {
    g.setColor(Color.YELLOW);
    g.fillOval(200, 200, 500, 500);
    g.setColor(Color.BLUE);
    g.fillOval(300, 360, 50, 50);
    g.setColor(Color.BLUE);
    g.fillOval(600, 360, 50, 50);
    g.drawArc(400, 400, 100, 40, 180, 185);
    repaint();
}

public void drawFrown(Graphics g) {
    g.setColor(Color.WHITE);
    g.fillOval(200, 200, 500, 500);
    g.setColor(Color.BLUE);
    g.fillOval(300, 360, 50, 50);
    g.setColor(Color.BLUE);
    g.fillOval(600, 360, 50, 50);
    g.drawArc(400, 400, 100, 40, 180, 185);
    repaint();
}


public static void main(String[] args) {
    JSmileFacePanel2 js = new JSmileFacePanel2();
}

}

最佳答案

您仍在 paint 方法之外调用绘画方法,因为 actionPerformed 方法与 paint 方法不同。它们在文本中并不重要,它仍然是一种不同的方法。

此外,每次出现重绘事件时,您都会重复添加操作监听器,这会减慢您的应用程序直至停止,并且也无法正确重绘。

因此,检查您是否应该在 paint 方法中微笑或皱眉,并在构造函数中添加操作监听器。

代码变为:

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class JSmileFacePanel2 extends JFrame {

    private static final long serialVersionUID = 1L;

    // by default should show smiling
    private boolean doSmile = true;

    JButton smile = new JButton("SMILE");
    JButton frown = new JButton("FROWN");

    public JSmileFacePanel2() {
        setLayout(new FlowLayout());
        setTitle("JSmileFace-V2: Jose M. Tobar");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        add(frown);
        add(smile);

        smile.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("SMILE BUTTON CLICKED");
                doSmile = true;
                repaint();
            }
        });

        frown.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("FROWN BUTTON CLICKED");
                doSmile = false;
                repaint();
            }
        });

        setSize(800, 800);
        setVisible(true);
    }

    public void paint(final Graphics g) {
        super.paint(g);

        if (doSmile) {
            drawSmile(g);
        } else {
            drawFrown(g);
        }
    }

    public void drawSmile(Graphics g) {
        g.setColor(Color.YELLOW);
        g.fillOval(200, 200, 500, 500);
        g.setColor(Color.BLUE);
        g.fillOval(300, 360, 50, 50);
        g.setColor(Color.BLUE);
        g.fillOval(600, 360, 50, 50);
        g.drawArc(400, 400, 100, 40, 180, 185);
    }

    public void drawFrown(Graphics g) {
        g.setColor(Color.WHITE);
        g.fillOval(200, 200, 500, 500);
        g.setColor(Color.BLUE);
        g.fillOval(300, 360, 50, 50);
        g.setColor(Color.BLUE);
        g.fillOval(600, 360, 50, 50);
        g.drawArc(400, 400, 100, 40, 180, 185);
    }

    public static void main(String[] args) {
        JSmileFacePanel2 js = new JSmileFacePanel2();
    }

}

关于java - 如何从Java中的多个方法中进行绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34281541/

相关文章:

java - Mockito 方法返回 null

java - 在 Java 中使用 JComponent 绘制和定位多个 BufferedImage

java - 在 JLabel 的开头放置 3 个点

java - JTable 中的列不更新

java - 配置 JPA 将所有枚举映射到字符串?

java - 使用矩形 2D 绘制具有不同方向的不同大小的矩形

android - 如何在不同的安卓屏幕尺寸和分辨率上获得相同尺寸的游戏元素

c# - Windows 窗体 "Hole"

java - Maven - 项目构建期间出现异常

java - 使用来自 sql 的数据将数据添加到组合框 - java