当JLabel在其上覆盖一个矩形时,它会失去对齐(也就是时髦)

时间:2014-12-06 00:58:38

标签: java swing jlabel

我正在为Java SWING中的流行软件ImageMagick制作GUI 现在,我正在实现Crop功能,并尝试实现一个可绘制的框来表示要裁剪的区域。
问题在于,虽然我已经在JLabel上绘制了矩形,但是{I}}本身在我完成绘制图形后开始移动。
例如,此处是应用beforeafter的屏幕截图。

以下是JLabel事件监听器的代码

MouseReleased()

以下是private void input_showerMouseReleased(java.awt.event.MouseEvent evt) { end_x = evt.getX(); end_y = evt.getY(); paint(input_shower.getGraphics()); input_shower.revalidate(); } 方法的代码

paint()

对于为什么会发生这种情况以及任何可能的解决方案有什么想法吗?

2 个答案:

答案 0 :(得分:2)

public void paint(Graphics g) {
    super.paintComponents(g);
  1. 通过覆盖paintComponent()方法完成自定义绘制。
  2. 然后调用super.paintComponent(),而不是“paintComponents”调用“s”
  3. 例如,请查看Custom Painting Approaches。代码不是为了满足您的需要而设计的,但它确实展示了如何使用上述建议在组件上绘制矩形。

答案 1 :(得分:2)

这是危险的代码:

private void input_showerMouseReleased(java.awt.event.MouseEvent evt) {                                           
    end_x = evt.getX();
    end_y = evt.getY();
    paint(input_shower.getGraphics());
    input_shower.revalidate();
}

因为您直接绘制到具有JVM未提供给您的Graphics对象的组件。只是不要这样做,而是被动地涂漆。

而是在听取jcomponent的paintComponent方法中使用end_x和end_y并使用它进行绘制。

如,

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class PaintComponentCorrect extends JPanel {
   public static final String BULL_FIGHT = "https://duke.kenai.com/misc/Bullfight.jpg";
   private static final Color RECT_COLOR = new Color(150, 150, 255);
   private int startX;
   private int startY;
   private int endX;
   private int endY;
   private BufferedImage img;

   public PaintComponentCorrect() throws IOException {
      URL url = new URL(BULL_FIGHT);
      img = ImageIO.read(url);

      MyMouseAdapt myMouseAdapt = new MyMouseAdapt();
      addMouseListener(myMouseAdapt);
      addMouseMotionListener(myMouseAdapt);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (img != null) {
         g.drawImage(img, 0, 0, null);
      }
      g.setColor(RECT_COLOR);
      int x = Math.min(startX, endX);
      int y = Math.min(startY, endY);
      int width = Math.abs(startX - endX);
      int height = Math.abs(startY - endY);
      g.drawRect(x, y, width, height);
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet() || img == null) {
         return super.getPreferredSize();
      }
      return new Dimension(img.getWidth(), img.getHeight());
   }

   private class MyMouseAdapt extends MouseAdapter {
      private BufferedImage subImg;

      @Override
      public void mousePressed(MouseEvent e) {
         if (e.getButton() != MouseEvent.BUTTON1) {
            return;
         }
         startX = e.getX();
         startY = e.getY();
         endX = startX;
         endY = startY;
         repaint();
      }

      @Override
      public void mouseReleased(MouseEvent e) {
         if (e.getButton() != MouseEvent.BUTTON1) {
            return;
         }
         endX = e.getX();
         endY = e.getY();
         repaint();
         int x = Math.min(startX, endX);
         int y = Math.min(startY, endY);
         int w = Math.abs(startX - endX);
         int h = Math.abs(startY - endY);


         subImg = img.getSubimage(x, y, w, h);
         ImageIcon icon = new ImageIcon(subImg);
         JOptionPane.showMessageDialog(PaintComponentCorrect.this, icon);
      }

      @Override
      public void mouseDragged(MouseEvent e) {
         endX = e.getX();
         endY = e.getY();
         repaint();
      }
   }

   private static void createAndShowGui() {
      PaintComponentCorrect mainPanel = null;
      try {
         mainPanel = new PaintComponentCorrect();
      } catch (IOException e) {
         e.printStackTrace();
         System.exit(-1);
      }

      JFrame frame = new JFrame("PaintComponent Correct");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}