为了账号安全,请及时绑定邮箱和手机立即绑定

Repaint() 方法不会一一调用paint() 和paintComponent() 方法

Repaint() 方法不会一一调用paint() 和paintComponent() 方法

慕妹3242003 2022-10-20 17:37:15
我的应用程序可以裁剪图像。我想要实现的是在根据从 MouseListeners 获取的坐标切割图像之前绘制的矩形。这是我的代码:public class ImageScreenShot extends JPanel implements MouseListener, MouseMotionListener {    ImagePanel im;    int drag_status = 0, c1, c2, c3, c4;    public int getC1() {        return c1;    }    public int getC2() {        return c2;    }    public int getC3() {        return c3;    }    public int getC4() {        return c4;    }    public void cut() {        im = new ImagePanel();        GraphicalUserInterface.getFrame().add(im);        im.addMouseMotionListener(this);        im.addMouseListener(this);    }    public void draggedScreen() throws Exception {        int w = c1 - c3;        int h = c2 - c4;        w = w * -1;        h = h * -1;        Robot robot = new Robot();        BufferedImage img = robot.createScreenCapture(new Rectangle(c1, c2, w, h));        File save_path = new File("screen1.jpg");        ImageIO.write(img, "JPG", save_path);        GraphicalUserInterface.getLabelIcon().setIcon(new ImageIcon(new ImageIcon(img).getImage().getScaledInstance(img.getWidth(),img.getHeight(),Image.SCALE_SMOOTH)));        JOptionPane.showConfirmDialog(null,"Would you like to save your cropped Pic?");        if(JOptionPane.YES_OPTION == 0){            PicChanges.getCurrentLabel();        } else {            PicChanges.getCurrentLabel();        }        System.out.println("Cropped image saved successfully.");    }    @Override    public void mouseClicked(MouseEvent arg0) {    }    @Override    public void mouseEntered(MouseEvent arg0) {    }    @Override    public void mouseExited(MouseEvent arg0) {    }}我很困惑,因为我不知道如何调用paint()方法,这就是为什么到目前为止,图像已正确裁剪但未绘制矩形。据我了解paintComponent(),当我调用 ImagePanel 类并将其添加MouseListeners到调用该repaint()方法的位置时,我的方法正在工作。要调用该paint()方法,我需要调用ImageScreenShot类,但在这里出现问题。所以我的问题是如何调用类中paint()方法调用的repaint()方法?MouseListenersImageScreenShot
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

我没有测试你的代码,但乍一看我可以看到:

  1. 您正在扩展JPanel,这很好,但是您正在覆盖paint(...)方法,您不应该这样做,您需要覆盖paintComponent(...)

  2. 在你的第二堂课上,你压倒一切paintComponent(...),但你没有打电话

    super.paintComponent(g);

    其中,正在打破油漆链。并且可能(连同第一点)是您错误的原因。

  3. 请参阅我应该避免在 Java Swing 中使用 set(Preferred|Maximum|Minimum)Size 方法吗?(是的),您需要在您的应用程序中覆盖getPreferredSize()and 调用pack()


查看完整回答
反对 回复 2022-10-20
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

arg0.getComponent().repaint();在哪里使用arg0MouseEvent。它将重新绘制触发事件的组件。请参阅https://docs.oracle.com/javase/8/docs/api/java/awt/event/ComponentEvent.html#getComponent--

返回: 发起事件的 Component 对象,如果该对象不是 Component,则返回 null。


查看完整回答
反对 回复 2022-10-20
  • 2 回答
  • 0 关注
  • 86 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信