0

クラスの早い段階で mouseListener が追加されたイメージ (imagePanel) をロードしました。

ImagePanel はドラッグされていますが、画像 (0,0) の左上隅だけです。以下のロジックは、マウス座標をオフセットしようとした私の試みですが、効果がないように見えます.mousePressed()が呼び出されていない可能性があります.

class MouseMotionHandler extends MouseMotionAdapter implements MouseListener
{
    int diffX, diffY;


    public void mousePressed(MouseEvent e)
    {
        diffX = e.getX() - imagePanel.getImageX();
        diffY = e.getY() - imagePanel.getImageY();
    }

    public void mouseDragged(MouseEvent e) 
    {                           
        imagePanel.setX(e.getX()-diffX);
        imagePanel.setY(e.getY()-diffY);
        imagePanel.repaint();
    }
    @Override
    public void mouseExited(MouseEvent e) {
    }
    @Override
    public void mouseEntered(MouseEvent e) {
    }
    @Override
    public void mouseReleased(MouseEvent e) {
    }
    @Override
    public void mouseClicked(MouseEvent e) {
    }
}

どんな助けでも素晴らしいでしょう。

編集:解決済み

問題は、リスナーを初期化した場所でした。mousePressed() は MouseListener クラスの一部であり、mouseDragged() は MouseMotionListener クラスの一部です。そのため、それぞれに個別のリスナーを追加する必要がありました。

MouseMotionHandler mouseMotionHandler = new MouseMotionHandler();
imagePanel.addMouseListener(mouseMotionHandler);
imagePanel.addMouseMotionListener(mouseMotionHandler);

ありがとう、ジャック

4

2 に答える 2

0

Transfer Handlerを使用しようとしましたか? 私は成功してそれを使用しました

JTable の例

tbItens.setTransferHandler(new TransferHandler(){

    @Override
     protected Transferable createTransferable(JComponent c)
     {
         JTable table= (JTable)c;
         int row = table.getSelectedRow();
         return new StringSelection(String.valueOf(row));
     }

    @Override
    public int getSourceActions(JComponent c)
    {
        return TransferHandler.COPY;
    }



    @Override
    public boolean canImport(TransferHandler.TransferSupport support)
    {
        if(!support.isDrop())
            return false;

        if (!support.isDataFlavorSupported(DataFlavor.stringFlavor))
                return false;

        boolean copySupported = (COPY & support.getSourceDropActions()) == COPY;
            if (copySupported) {
                support.setDropAction(COPY);
                return true;
            }
        return false;
    }

    @Override
    public boolean importData(TransferHandler.TransferSupport support)
    {
        if(!this.canImport(support))
            return false;
        JTable.DropLocation dl = (JTable.DropLocation) support.getDropLocation();
        int row = dl.getRow();


        String data;
        try
        {
            data = (String)support.getTransferable().getTransferData(DataFlavor.stringFlavor);
        }
        catch (Exception e)
        {
            return false;
        }


        if(data == null || data.isEmpty())
            return false;

        //row = para onde vai
        //i é aonde estava
        int i = Integer.valueOf(data);

        ArrayList<Object> lo = new ArrayList<Object>();
        for(int k=0; k< tbItens.getRowCount(); k++)
        {
            Object v = tbItens.getValueAt(k, 0);
            lo.add(v);
        }
        DefaultTableModel dt = (DefaultTableModel) tbItens.getModel();
        while(dt.getRowCount() != 0)
            dt.removeRow(0);

        Object item = lo.remove((int)i);
        lo.add(row, item);

        for(Object o : lo)
            dt.addRow(new Object[]{o});
        return true;
    }

});
于 2013-02-26T11:30:35.093 に答える
0

thisを見てください。マウスモーションリスナーの使用例を示しています。

于 2013-02-26T11:41:58.477 に答える