gpt4 book ai didi

java - 还记得鼠标点击的位置吗?数组列表?哈希码?

转载 作者:搜寻专家 更新时间:2023-10-30 21:32:30 26 4
gpt4 key购买 nike

抱歉,我删除了我的 APPLES 和 CATS 示例 :) 这是我的问题的更新版本!

我在这里失去了理智。我需要一个能启发我的人。我试过几次在这里解释我的问题。希望这一次,我的问题会更容易理解。

基本上我有这个框架,并且显示了一个图像。右侧有一个 JList,底部还有另一个 JLabels 面板。这是我的框架的屏幕截图。

enter image description here

当我单击图像时,会弹出一个 JOptionPane,就像这样。然后我输入我的输入。我的 JList 是一个 ArrayList,所以我输入的所有内容都会添加到底部的 JList 和 JPanel。

enter image description here

现在,当我将鼠标悬停在我单击的部分时,您会注意到正方形消失了)。它仅在我单击图像以及将标签悬停在底部时出现。我的标签,截至目前是 LOLZ NOSE 和 INPUT HERE。

enter image description here

我想做的是,当我将鼠标悬停在标签上时,例如 INPUT HERE,它会再次显示正方形,其中包含我点击的部分。我现在的问题是当我点击 NOSE 时,它应该在 Nose 部分显示一个正方形和一个带有黑色 bg 的名称 NOSE,它没有显示。此外,仅显示最后一个标签的方 block ,忽略其他标签的点击位置。

如何获得一个标签来记住我点击的位置?人们说我应该使用 ArrayLists 或 HashCodes 但是我不知道如何实现它们。感谢任何可以提供帮助的人。

编辑:我已经完成了矩形,顺便说一下。它仅针对输入的最后一个标签显示。以下是请求的一些代码片段!

我如何在 JLabel 上设置文本并更新 JList:

public void updateLabel(){

StringBuilder text = new StringBuilder(); //creates empty builder, capacity 16

for(Object s: tagModel.toArray()) //returns an array containing the elements of the tagModel
text.append(" " + s);

repaint();
hoverLabel.setText(text.toString()); //returns a String
hoverLabel.addMouseMotionListener(this);
hoverPanel.add(hoverLabel);

}

点击时我的 mouseListener:

@Override
public void mouseClicked(MouseEvent event) {
// TODO Auto-generated method stub

x = event.getX();
y = event.getY();

isRectPresent = true;
repaint();

input = JOptionPane.showInputDialog("Enter tag name:");

if((input != null) && !input.isEmpty()){
tagModel.addElement(input);
}
}

悬停时我的 mouseMotionListener:

@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub

xpos = e.getX(); //gets where the mouse moved
ypos = e.getY();

//checks if the mouse is inside the bounds of the rectangle
if (xpos > x && xpos < x + 100 && ypos > y && ypos < y + 100)
isRectPresent = false;

if(e.getSource() == hoverLabel){
isRectPresent = true;
repaint();
}

repaint();
}

我是如何画画的:

    public void paintComponent(Graphics g){ 
Graphics2D g2 = (Graphics2D) g;

g2.drawImage(image, 0, 0, null);

if(image != null && isRectPresent){
Stroke stroke = g2.getStroke();
g2.setStroke(new BasicStroke(4));
g2.setColor(Color.WHITE);
g2.drawRect(x-50, y-50, 100, 100);
g2.setStroke(stroke);
}else{
if(xpos > x && xpos < x + 100 && ypos > y && ypos < y + 100){
g.setColor(Color.BLACK);
g.fillRect(x-50, y-50, 100, 25);
g.setColor(Color.WHITE);
g.setFont(new Font("Tahoma", Font.BOLD, 12));
g.drawString(input, x-30, y-30);
}
}
}

如果您想让我添加更多片段,请告诉我! :)

最佳答案

你应该创建一个 HashMap,像这样说:

Map linkSet = new HashMap();

每当您单击绘图并创建标签时,使用 put 方法将 JLabel 和图像上的点添加到集合中,并将 JLabel 作为键,将 Point 作为值。然后在 JLabel 的 MouseMotionListener 中,使用您的标签作为键,并使用 map 的 get(...) 方法从集合中获取对应的点。

编辑:
根据 alicedimarco 的评论更正。再次感谢!

编辑 2
我想你想再次使用 map 。如果你有一个 map ,你可以让它从 JLabel 或 JList 的字符串中检索兴趣点,然后将这个点传递给绘制图像的类,让它使用点来绘制一个矩形。例如,您可以为图像绘制类提供一个名为 displayPoint 的点字段和一个名为 setDisplayPoint(Point p) 的方法。它可以像这样简单:

public void setDisplayPoint(Point p) {
this.displayPoint = p;
repaint();
}

并假设感兴趣的对象以该点为中心,在 paintComponent 方法中使用 displayPoint:

protected void paintComponent(Graphics g) {
super.paintComponent(g);
// draw image
if (img != null) {
g.drawImage(img, X_SHIFT, Y_SHIFT, null);
}

// if displayPoint not null, draw the surrounding rectangle
if (displayPoint != null) {
g.setColor(RECT_COLOR);
int x = displayPoint.x - RECT_WIDTH / 2;
int y = displayPoint.y - RECT_WIDTH / 2;
int width = RECT_WIDTH;
int height = RECT_WIDTH;
g.drawRect(x, y, width, height);
}
}

编辑 3:
要获得鼠标点击,这非常简单,只需将 MouseListener 添加到保存图像的组件即可:

     // !! added
imgRect.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
imgMousePressed(e);
}
});

在从这个鼠标监听器调用的代码中,使用 JOptionPane 获取用户选择的标签名称,并将结果字符串添加到 listDataModel 中,以便在 JList 和 stringPointMap 中一起看到使用从 MouseEvent 获得的点,以便您可以将字符串映射到点并能够检索它:

// !! added
private void imgMousePressed(MouseEvent e) {
String result = JOptionPane.showInputDialog(this,
"Please enter name for this point on image:");
if (result != null) {
stringPointMap.put(result, e.getPoint());
listDataModel.addElement(result);
}
}

就是这样。

然后把它们放在一起:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class ImageRectMain extends JPanel {
private ImageRect imgRect;
private DefaultListModel listDataModel = new DefaultListModel();
private JList list = new JList(listDataModel);
private Map<String, Point> stringPointMap = new HashMap<String, Point>();

public ImageRectMain() {
String nose = "Nose";
String ear = "Ear";
String rightEye = "Right Eye";
String leftEye = "Left Eye";
listDataModel.addElement(ear);
listDataModel.addElement(nose);
listDataModel.addElement(rightEye);
listDataModel.addElement(leftEye);
stringPointMap.put(nose, new Point(480, 500));
stringPointMap.put(ear, new Point(270, 230));
stringPointMap.put(rightEye, new Point(380, 390));
stringPointMap.put(leftEye, new Point(662, 440));

MouseAdapter listMouseAdapter = new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
listMouseMoved(e);
}

@Override
public void mouseExited(MouseEvent e) {
listMouseExited(e);
}

};
list.addMouseMotionListener(listMouseAdapter);
list.addMouseListener(listMouseAdapter);

try {
imgRect = new ImageRect();

// !! added
imgRect.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
imgMousePressed(e);
}
});

JPanel eastPanel = new JPanel();
eastPanel.setLayout(new BoxLayout(eastPanel, BoxLayout.PAGE_AXIS));
eastPanel.add(new JLabel("You have tagged the following:"));
eastPanel.add(new JScrollPane(list));
eastPanel.add(Box.createVerticalGlue());
eastPanel.add(Box.createVerticalGlue());
eastPanel.add(Box.createVerticalGlue());
eastPanel.add(Box.createVerticalGlue());
setLayout(new BorderLayout());
add(imgRect, BorderLayout.CENTER);
add(eastPanel, BorderLayout.EAST);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

// !! added
private void imgMousePressed(MouseEvent e) {
String result = JOptionPane.showInputDialog(this,
"Please enter name for this point on image:");
if (result != null) {
stringPointMap.put(result, e.getPoint());
listDataModel.addElement(result);
}
}

private void listMouseExited(MouseEvent e) {
imgRect.setDisplayPoint(null);
}

private void listMouseMoved(MouseEvent e) {
int index = list.locationToIndex(e.getPoint());
Object value = listDataModel.get(index);
if (value != null) {
Point point = stringPointMap.get(value.toString());
if (point != null) {
imgRect.setDisplayPoint(point);
}
}
}

private static void createAndShowGui() {
JFrame frame = new JFrame("ImageRectMain");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ImageRectMain());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

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

@SuppressWarnings("serial")
class ImageRect extends JPanel {
public static final String IMAGE_PATH = "http://i.stack.imgur.com/7oNzg.jpg";
private static final int DEFAULT_W = 687;
private static final int DEFAULT_H = 636;
private static final int X_SHIFT = -6;
private static final int Y_SHIFT = -26;
private static final Color RECT_COLOR = Color.pink;
private static final int RECT_WIDTH = 40;
private BufferedImage img;
private Point displayPoint = null;

public ImageRect() throws MalformedURLException, IOException {
img = ImageIO.read(new URL(IMAGE_PATH));
}

public void setDisplayPoint(Point p) {
this.displayPoint = p;
repaint();
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
g.drawImage(img, X_SHIFT, Y_SHIFT, null);
}
if (displayPoint != null) {
g.setColor(RECT_COLOR);
int x = displayPoint.x - RECT_WIDTH / 2;
int y = displayPoint.y - RECT_WIDTH / 2;
int width = RECT_WIDTH;
int height = RECT_WIDTH;
g.drawRect(x, y, width, height);
}
}

@Override
public Dimension getPreferredSize() {
return new Dimension(DEFAULT_W, DEFAULT_H);
}
}

关于java - 还记得鼠标点击的位置吗?数组列表?哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8330787/

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