gpt4 book ai didi

java - 将矩形打印到 JPanel 上的图像上

转载 作者:行者123 更新时间:2023-12-01 23:45:03 24 4
gpt4 key购买 nike

我有一个小型图片库,可以使用 JButtons“下一个”和“上一个”来查看。它工作正常。

我想要做的是在点击图像时显示的图像上绘制一个矩形(只是框架,没有填充)。例如,如果我单击点 (230,150),我希望我的矩形以其左下角出现在该点中。

这是我的代码,我尝试了很多方法但没有任何效果:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Rectangle2D;
import java.awt.Image;

public class rectOnGallery extends JFrame{

private static final long serialVersionUID = 1L;

private ImageIcon myImage1;
private ImageIcon myImage2;
private ImageIcon myImage3;
private ImageIcon myImage4;
JPanel ImageGallery = new JPanel();
private ImageIcon[] myImages = new ImageIcon[4];
private int curImageIndex=0;

int width;
int height;

public rectOnGallery(){

double scale = 0.666667;
width = (int) (scale * 612);
height = (int) (scale * 792);

myImage1 = new ImageIcon(((new ImageIcon("NewSign1.jpg")).getImage()).getScaledInstance(width, height, Image.SCALE_SMOOTH));
myImage2 = new ImageIcon(((new ImageIcon("pdf2.jpg")).getImage()).getScaledInstance(width, height, Image.SCALE_SMOOTH));
myImage3 = new ImageIcon(((new ImageIcon("pdfimg.jpg")).getImage()).getScaledInstance(width, height, Image.SCALE_SMOOTH));
myImage4 = new ImageIcon(((new ImageIcon("images.jpg")).getImage()).getScaledInstance(width, height, Image.SCALE_SMOOTH));

ImageGallery.add(new JLabel (myImage1));
myImages[0]=myImage1;
myImages[1]=myImage2;
myImages[2]=myImage3;
myImages[3]=myImage4;


ImageGallery.addMouseListener(new MouseAdapter() {

public void mouseClicked(MouseEvent evt) {
if (myImages[curImageIndex] != null) {
double x = (getWidth() - width) / 2;
double y = (getHeight() - height) / 2;
Rectangle2D.Double bounds = new Rectangle2D.Double(x, y, width, height);
if (bounds.contains(evt.getPoint())) {
System.out.println("You clicked on " + evt.getX() + " x " + evt.getY());

**** HERE GOES SOMETHING THAT WRITES THE FRAME IN THE
**** POSITION (ent.getX() , evt.getY())

}
}
}
});

add(ImageGallery, BorderLayout.NORTH);

JButton PREVIOUS = new JButton ("Previous");
JButton NEXT = new JButton ("Next");

JPanel buttons = new JPanel();
buttons.setLayout(new GridLayout(1,4));
buttons.add(PREVIOUS);
buttons.add(NEXT);

add(buttons, BorderLayout.SOUTH);

//register listener
PreviousButtonListener PreviousButton = new PreviousButtonListener ();
NextButtonListener NextButton = new NextButtonListener ();

//add listeners to corresponding componenets
PREVIOUS.addActionListener(PreviousButton);
NEXT.addActionListener(NextButton);
}

private class PreviousButtonListener implements ActionListener {

public void actionPerformed(ActionEvent e){

if(curImageIndex>0 && curImageIndex <= 3){
ImageGallery.remove(0);
curImageIndex -- ;
ImageIcon TheImage= myImages[curImageIndex];
ImageGallery.add(new JLabel (TheImage));
ImageGallery.validate();
ImageGallery.repaint();
}
else{
ImageGallery.remove(0);
ImageGallery.add(new JLabel (myImage1));
curImageIndex=0;
ImageGallery.validate();
ImageGallery.repaint();
}
}
}

private class NextButtonListener implements ActionListener {

public void actionPerformed(ActionEvent e){

if(curImageIndex>=0 && curImageIndex < 3){
ImageGallery.remove(0);
curImageIndex ++ ;
ImageIcon TheImage= myImages[curImageIndex];
ImageGallery.add(new JLabel (TheImage));

ImageGallery.validate();
ImageGallery.repaint();
}
else{
ImageGallery.remove(0);
ImageGallery.add(new JLabel (myImage4));
curImageIndex=3;
ImageGallery.validate();
ImageGallery.repaint();
}
}
}

public static void main (String [] args){

provaPosFirma frame = new provaPosFirma();

frame.setSize(500, 600);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
}
}

作为替代方案,我还尝试在另一个图像上绘制矩形图像,但效果更好。

我知道我做错了,这应该更容易出现,但我没有解决这个问题。如果您可以帮助我在显示上绘制矩形或另一个矩形图像,无论如何,我们将不胜感激。

提前致谢

最佳答案

为此,您需要创建 JPanel 的自定义子类,并使用它而不是“ImageGallery”。然后,在该类中,重写 PaintComponent 方法来绘制所需的矩形。所以代码看起来像这样。

class ImageGalleryPanel extends JPanel{
private Point rectPosition = null;
private Dimension rectSize; //Set the size of the rect

public void setRectPosition(Point p){
rectPosition = p;
}

private void drawRect(Graphics g){
if(rectPosition != null){
g.drawRect(rectPosition.x, rectPosition.y, rectSize.width, rectSize.height);
}
}

@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
drawRect(g);
}
}

用此类替换 JPanel“ImageGallery”,并指定要绘制的矩形的大小。在您有评论绘制矩形的地方,添加这些行 -

ImageGallery.setRectPosition(evt.getPoint());
ImageGallery.repaint();

我没有测试这段代码,所以它可能有一些拼写错误,但这是绘制到 JPanel 时想要的基本想法。覆盖面板的绘制方法。然后,当您想要绘制它时,将其属性更改为应有的值并调用 repaint()。如果您只是尝试直接在其上绘图,那么将自动调用 repaint 方法,覆盖您所做的任何更改。

编辑 - 为了避免图像被绘制在矩形上,您可以执行一些操作。您可以将paintComponent方法更改为“paint”或“paintChildren”,并更改super.paintComponent函数调用以匹配。这既快速又简单,但被认为是不好的做法。我认为可行的另一种方法是,不覆盖 JPanel 的 PaintComponent,而是覆盖您要添加到其中的 JLabel。代码将完全相同,您只需将其应用到 JLabel 即可。

关于java - 将矩形打印到 JPanel 上的图像上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17208209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com