2012-02-28 3 views
1

Я имел взгляд вокруг этой проблемы, но не смог найти ответ ...Java Swing - Drag & падение шнурок Текст

Я в настоящее время JPanel, в котором я малярный груз юникода (ноты) с использованием метода Graphics2Dg2.drawString().

У меня есть ArrayList из KeyPress объектов, каждый из которых содержит один или несколько звонков g2.drawString().

Так что каждый KeyPress объект является нотной записью и окрашен в JPanel.

Как я могу добавить функциональность, позволяющую пользователю выбирать и перетаскивать объекты?

+0

Я не уверен, что это настоящая проблема с перетаскиванием (которая использует поддержку передачи данных Drag and Drop), но я считаю, что, скорее всего, это простой MouseListener-щелчок и перетаскивание экранной графики или проблема с спрайтом. Итак, что вы пробовали? Вы знакомы с использованием MouseListeners и MouseMotionListeners? –

+0

Я пробовал примеры с перетаскиванием прямоугольников и других фигур с границами, но я не знаю, как определить, находится ли щелчок мыши в области строки. –

ответ

1

См. Учебное пособие по адресу supporting user interaction.. Оно сводится к определению того, какие объекты (если есть) находились под мышью при щелчке и удерживании. При событии перетаскивания выбранный объект перемещается, а полотно перекрашивается.

Вы можете получить границы строки с помощью FontMetrics:

String text = "Hello world!"; 
Rectangle2D bounds = g2.getFontMetrics().getStringBounds(text, g2); 

Я предполагаю, что прямоугольник в левом верхнем углу будет (0, 0), так что вам нужно добавить (х, у) к нему (где x, y - параметры, которые вы передали drawString).

+0

Спасибо, но как мне получить границы строки? –

+0

Обновление ответа ... – sjr

+0

Спасибо за обновление, в настоящее время я переводил прямоугольник 'bounds', есть ли способ установить координаты прямоугольника? –

3

Почему бы не положить ваши строки в JLabels и просто перетащите их ...

import java.awt.*; 
import java.awt.event.*; 
import java.util.Random; 
import javax.swing.*; 

public class DragLabelEg { 
    private static final String[] LABEL_STRINGS = { "Do", "Re", "Me", "Fa", 
     "So", "La", "Ti" }; 
    private static final int HEIGHT = 400; 
    private static final int WIDTH = 600; 
    private static final Dimension MAIN_PANEL_SIZE = new Dimension(WIDTH, HEIGHT); 
    private static final int LBL_WIDTH = 60; 
    private static final int LBL_HEIGHT = 40; 
    private static final Dimension LABEL_SIZE = new Dimension(LBL_WIDTH, 
     LBL_HEIGHT); 
    private JPanel mainPanel = new JPanel(); 
    private Random random = new Random(); 

    public DragLabelEg() { 
     mainPanel.setPreferredSize(MAIN_PANEL_SIZE); 
     mainPanel.setLayout(null); 

     MyMouseAdapter myMouseAdapter = new MyMouseAdapter(); 
     for (int i = 0; i < LABEL_STRINGS.length; i++) { 
     JLabel label = new JLabel(LABEL_STRINGS[i], SwingConstants.CENTER); 
     label.setSize(LABEL_SIZE); 
     label.setOpaque(true); 
     label.setLocation(random.nextInt(WIDTH - LBL_WIDTH), 
       random.nextInt(HEIGHT - LBL_HEIGHT)); 
     label.setBackground(new Color(150 + random.nextInt(105), 150 + random 
       .nextInt(105), 150 + random.nextInt(105))); 
     label.addMouseListener(myMouseAdapter); 
     label.addMouseMotionListener(myMouseAdapter); 

     mainPanel.add(label); 
     } 
    } 

    public JComponent getMainPanel() { 
     return mainPanel; 
    } 

    private class MyMouseAdapter extends MouseAdapter { 
     private Point initLabelLocation = null; 
     private Point initMouseLocationOnScreen = null; 

     @Override 
     public void mousePressed(MouseEvent e) { 
     JLabel label = (JLabel) e.getSource(); 
     // get label's initial location relative to its container 
     initLabelLocation = label.getLocation(); 

     // get Mouse's initial location relative to the screen 
     initMouseLocationOnScreen = e.getLocationOnScreen(); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
     initLabelLocation = null; 
     initMouseLocationOnScreen = null; 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
     // if not dragging a JLabel 
     if (initLabelLocation == null || initMouseLocationOnScreen == null) { 
      return; 
     } 
     JLabel label = (JLabel) e.getSource(); 

     // get mouse's new location relative to the screen 
     Point mouseLocation = e.getLocationOnScreen(); 

     // and see how this differs from the initial location. 
     int deltaX = mouseLocation.x - initMouseLocationOnScreen.x; 
     int deltaY = mouseLocation.y - initMouseLocationOnScreen.y; 

     // change label's position by the same difference, the "delta" vector 
     int labelX = initLabelLocation.x + deltaX; 
     int labelY = initLabelLocation.y + deltaY; 

     label.setLocation(labelX, labelY); 
     } 
    } 

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

    private static void createGui() { 
     JFrame frame = new JFrame("App"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new DragLabelEg().getMainPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

Я думаю, что автор, вероятно, захочет выбрать кучу «ярлыков», а затем переместить все вместе, в этом случае мышь вниз, события перемещения мыши должны проверить, есть ли у нас «выбранные элементы» или нет – Dapeng

1

example Это показывает один из способов, чтобы выбрать несколько объектов, с помощью клавиатуры или мыши, и перетащите их в качестве группы. Он управляет произвольными узлами, а не глифами, но вы можете найти его поучительным.

Смежные вопросы