Извините, ребята, я удалил пример с ЯБЛОКАМИ и КОШКАМИ :) Вот обновленная версия моего вопроса!
Я теряю здесь здравомыслие. Мне нужен кто-то, кто может просветить меня. Я пытался пару раз объяснить мою проблему здесь. Надеюсь, на этот раз мой вопрос будет легче понять.
В основном у меня есть этот кадр, и там отображается изображение. Справа - JList, а внизу - еще одна панель для JLabels. Вот скриншот моей рамки.
![enter image description here](https://i.stack.imgur.com/7oNzg.jpg)
Когда я нажимаю на изображение, появляется окно JOptionPane, вот так. И я ввожу свои данные. Мой JList - это ArrayList, поэтому все, что я ввел, добавляется в JList и JPanel внизу.
![enter image description here](https://i.stack.imgur.com/9iVWK.jpg)
Теперь, когда я наведу курсор на ту часть, где я щелкнул, вы заметили, что квадрат исчез). Он появляется только тогда, когда я нажимаю на изображение, и когда я наводю ярлык внизу. На данный момент мои ярлыки - LOLZ NOSE и INPUT HERE.
![enter image description here](https://i.stack.imgur.com/WDcTU.jpg)
Что я хочу сделать, так это когда я наведите курсор на ярлык, например, ВВОД ЗДЕСЬ, на нем снова будет отображаться квадрат с той частью, где я щелкнул. Моя проблема сейчас, когда я нажимаю на НОС, который должен показывать квадрат на носовой части и имя НОС с черным bg, ЭТО НЕ ПОКАЗЫВАЕТ. Кроме того, отображается только квадрат последней метки, независимо от позиции других меток, на которую нажали.
Как мне получить метку, чтобы запомнить положение клика, который я делаю? Люди говорили, что я должен использовать 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);
}
}
}
Если вы хотите, чтобы я добавил еще фрагменты, просто скажите мне! :)