【问题标题】:How can I pass an argument to paintComponent in order to call it in a different class?如何将参数传递给 paintComponent 以便在不同的类中调用它?
【发布时间】:2019-04-26 11:46:56
【问题描述】:

在我的主类中,我有以下代码从我的机器加载图像并将其显示在框架上以在其上绘制东西:

public class ShowMap extends JPanel {

    private static final int WIDTH = 1340;
    private static final int HEIGHT = 613;

    public void main(String args[]) {
        JFrame frame = new JFrame("MAP");
        frame.setPreferredSize(new Dimension(WIDTH, HEIGHT));
        frame.setMinimumSize(new Dimension(WIDTH, HEIGHT));
        frame.setMaximumSize(new Dimension(WIDTH, HEIGHT));
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = (JPanel)frame.getContentPane();
        JLabel label = new JLabel();
        label.setIcon(new ImageIcon("map.png"));
        panel.add(label);
    }
}

我正在加载的图像是一张地图,我想通过在正确的坐标中绘制点来指示某些对象的位置。因此,在这里向DrawPoint 类(如下)指示什么坐标应该得到该点很重要。

另外,我非常感谢您解释如何擦除已绘制的点。

我的搜索将我带到以下内容,但是一旦我将int coordx, int coordy 添加到方法的参数中,它就不再突出显示,并且我不知道如何在传递时在ShowMap 中调用此方法坐标作为参数。

public class DrawPoint extends JPanel {

    private int coordx;
    private int coordy;

    public void paintComponent(Graphics g, int coordx, int coordy){
        g.setColor(Color.BLACK);
        g.fillOval(coordx,coordy,8,8);
    }
}

【问题讨论】:

  • 首先,你不能——也不应该。 Paint 应该绘制组件的当前状态,这意味着您应该更改组件的状态变量,然后调用 repaint。其次,您只需调用 super.paintComponent,它会清除上下文,以便您可以再次在其上绘画

标签: java swing graphics awt custom-painting


【解决方案1】:

这是 MadProgrammer 在他的 comment 中所写的演示:“应该更改组件的状态变量,然后调用 repaint”:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class SwingTest extends JFrame {

    private static final int SIZE = 300;
    private DrawPoint drawPoint;

    public SwingTest()  {

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        drawPoint = new DrawPoint();
        drawPoint.setPreferredSize(new Dimension(SIZE, SIZE));
        add(drawPoint);
        pack();
        setVisible(true);
    }

    //demonstrate change in DrawPoint state
    private void reDraw() {

        Random rnd = new Random();
        Timer timer = new Timer(1000, e -> { //periodically change coordinates and repaint
            drawPoint.setCoordx(rnd.nextInt(SIZE));
            drawPoint.setCoordy(rnd.nextInt(SIZE));
            drawPoint.repaint();
        });
        timer.start();
    }

    public static void main(String[] args){
        SwingUtilities.invokeLater(() ->    new SwingTest().reDraw());
    }
}

class DrawPoint extends JPanel {

    private int coordx, coordy;

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.fillOval(coordx,coordy,8,8);
    }

    //use setters to change the state 
    void setCoordy(int coordy) {    this.coordy = coordy; }
    void setCoordx(int coordx) {this.coordx = coordx;}
}

【讨论】:

  • c0der,您能否解释一下我如何在从我的机器上加载的图像上执行此操作?
  • 假设您的图像是Image bgImage,由g.drawImage(bgImage, 0, 0, this); 绘制。如果您需要帮助,请发布一个新问题并在此处给我留言,以便我尝试提供帮助。
  • 我发布了一个新问题,链接:stackoverflow.com/questions/53462122/…。谢谢大家的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多