第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將 JLabel 拖放到 JPanel 中

如何將 JLabel 拖放到 JPanel 中

動漫人物 2021-10-28 17:21:45
在研究了如何使用Label DnD 后,我遇到了使用此解決方案的問題: public class LayerItem extends JLabel {    int x = 0, y = 0;    public LayerItem(String text) {        this.setText(text);        this.addMouseMotionListener(new MouseAdapter(){            @Override            public void mouseDragged(MouseEvent evt){                lblMouseDragged(evt);            }        });    }    protected void lblMouseDragged(MouseEvent evt){        this.x = evt.getX();        this.y = evt.getY();    }}當(dāng)用戶單擊并按住 JLabel 時,X 和 Y 會隨著鼠標移動而被記錄下來。但是,我不知道如何知道單擊何時停止(即,用戶到達他的目標 JPanel)然后將文本移入其中。允許 JPanels 接收放置操作的唯一參考是執(zhí)行以下操作:new JPanel().setDropTarget(getDropTarget());但是,我無法再次找到有關(guān)通過 JLabel 作為坐標(絕對布局)放置目標的任何參考。
查看完整描述

1 回答

?
慕斯王

TA貢獻1864條經(jīng)驗 獲得超2個贊

在查看@ MadProgrammer發(fā)布的幾個示例后,我想出了一個擴展 JPanel 和 JLabel 的解決方案。這是 JLabel 類:


public class LayerItem extends JLabel {


    public LayerItem(String text) {


        this.setText(text);


        this.setTransferHandler(new ValueExportTransferHandler(text));


        this.addMouseMotionListener(new MouseAdapter() {

            @Override

            public void mouseDragged(MouseEvent e) {

                JLabel lbl = (JLabel) e.getSource();

                TransferHandler handle = lbl.getTransferHandler();

                handle.exportAsDrag(lbl, e, TransferHandler.COPY);

            }

        });


    }


    protected static class ValueExportTransferHandler extends TransferHandler {


        public static final DataFlavor SUPPORTED_DATE_FLAVOR = DataFlavor.stringFlavor;

        private String value;


        public ValueExportTransferHandler(String value) {

            this.value = value;

        }


        public String getValue() {

            return value;

        }


        @Override

        public int getSourceActions(JComponent c) {

            return DnDConstants.ACTION_COPY_OR_MOVE;

        }


        @Override

        protected Transferable createTransferable(JComponent c) {

            Transferable t = new StringSelection(getValue());

            return t;

        }


        @Override

        protected void exportDone(JComponent source, Transferable data, int action) {

            super.exportDone(source, data, action);

            // Clean up and remove the LayerItem that was moved

            ((LayerItem) source).setVisible(false);

            ((LayerItem) source).getParent().remove((LayerItem) source);

        }


    }

}

這是 JPanel 的類:


public class LayerContainer extends JPanel {


    public LayerContainer() {

        this.setTransferHandler(new ValueImportTransferHandler());

        this.setLayout(new GridBagLayout()); // Optional layout

        this.setBorder(new CompoundBorder(new LineBorder(Color.DARK_GRAY), new EmptyBorder(20, 20, 20, 20))); // Optional border

    }


    protected static class ValueImportTransferHandler extends TransferHandler {


        public static final DataFlavor SUPPORTED_DATE_FLAVOR = DataFlavor.stringFlavor;


        public ValueImportTransferHandler() {

        }


        @Override

        public boolean canImport(TransferHandler.TransferSupport support) {

            return support.isDataFlavorSupported(SUPPORTED_DATE_FLAVOR);

        }


        @Override

        public boolean importData(TransferHandler.TransferSupport support) {

            boolean accept = false;

            if (canImport(support)) {

                try {

                    Transferable t = support.getTransferable();

                    Object value = t.getTransferData(SUPPORTED_DATE_FLAVOR);

                    if (value instanceof String) { // Ensure no errors

                        // TODO: here you can create your own handler

                        // ie: ((LayerContainer) component).getHandler()....

                        Component component = support.getComponent();

                        LayerItem j = new LayerItem((String) value);

                        ((LayerContainer) component).add(j); // Add a new drag JLabel

                        accept = true;

                    }

                } catch (Exception exp) {

                    exp.printStackTrace();

                }

            }

            return accept;

        }

    }


}

這是一個如何使用它的示例(從一個 JPanel 拖到另一個并再次返回):


    JPanel left_panel = new LayerContainer();

    panel_1.setBounds(28, 47, 129, 97);

    add(panel_1);


    LayerContainer right_panel = new LayerContainer();

    layerContainer.setBounds(203, 47, 129, 97);

    add(layerContainer);


    JLabel lblToDrag = new LayerItem("Drag Me");

    GridBagConstraints gbc_lblToDrag = new GridBagConstraints();

    gbc_lblDragMe.gridx = 0;

    gbc_lblDragMe.gridy = 0;

    panel_right.add(lblToDrag, gbc_lblToDrag);

為了將來使用,我將創(chuàng)建一個onTransfer()方法并創(chuàng)建我自己LayerContainerHandler()的run()方法來覆蓋一個方法,因此每次將標簽移動到不同的容器時,它都會執(zhí)行單獨的操作。


查看完整回答
反對 回復(fù) 2021-10-28
  • 1 回答
  • 0 關(guān)注
  • 444 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號