[英]Repaint() method doesn't invoke paint() & paintComponent() methods one by one, only paintComponent () method is working
我的應用程序可以裁剪圖像。 我要實現的是根據從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) {
}
@Override
public void mousePressed(MouseEvent arg0) {
repaint();
c1 = arg0.getXOnScreen();
c2 = arg0.getYOnScreen();
}
@Override
public void mouseReleased(MouseEvent arg0) {
repaint();
if (drag_status == 1) {
c3 = arg0.getXOnScreen();
c4 = arg0.getYOnScreen();
try {
this.repaint();
draggedScreen();
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("Issue is under construction");
}
}
@Override
public void mouseDragged(MouseEvent arg0) {
repaint();
drag_status = 1;
c3 = arg0.getXOnScreen();
c4 = arg0.getYOnScreen();
}
@Override
public void mouseMoved(MouseEvent arg0) {
}
@Override
public void paint(Graphics g) {
super.paint(g);
int w = c1 - c3;
int h = c2 - c4;
w = w * -1;
h = h * -1;
if (w < 0)
w = w * -1;
g.setColor(Color.RED);
g.drawRect(c1, c2, w, h);
System.out.println("paint component");
}
}
public class ImagePanel extends JPanel {
private BufferedImage imageToCut;
public ImagePanel() {
Dimension size = new
Dimension(GraphicalUserInterface.getLabelIcon().getSize());
setPreferredSize(size);
setMaximumSize(size);
setMinimumSize(size);
setSize(size);
}
@Override
protected void paintComponent(Graphics g) {
g.drawImage(imageToCut, 0, 0, null);
System.out.println("painted");
}
}
我很困惑,因為我不知道如何調用paint()
方法,這就是為什么到目前為止,圖像被正確裁剪並正確繪制但矩形未繪制的原因。 據我了解,當我調用ImagePanel類並在調用repaint()
方法的位置添加MouseListeners
,我的paintComponent()
方法正在工作。
要調用paint()
方法,我需要調用ImageScreenShot
類,但是在這里出現問題。
所以我的問題是如何在ImageScreenShot
類的MouseListeners
中調用由repaint()
方法調用的paint()
方法?
我尚未測試您的代碼,但是乍看之下我可以看到:
您正在擴展JPanel
,這很好,但是您覆蓋了paint(...)
方法,則不應該這樣做,需要覆蓋paintComponent(...)
在第二堂課上,您覆蓋了paintComponent(...)
但沒有調用
super.paintComponent(g);
其中,正在打破油漆鏈。 可能(連同第一點)是您出錯的原因。
請參閱我應該避免在Java Swing中使用set(Preferred | Maximum | Minimum)Size方法嗎? (是),您需要在應用程序中覆蓋getPreferredSize()
並調用pack()
。
使用arg0.getComponent().repaint();
其中arg0
是MouseEvent。 它將重新繪制觸發事件的組件。 參見https://docs.oracle.com/javase/8/docs/api/java/awt/event/ComponentEvent.html#getComponent--
返回:引發事件的Component對象;如果該對象不是Component,則返回null。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.