【问题标题】:How to move Jlabel from one JPanel to another [closed]如何将 Jlabel 从一个 JPanel 移动到另一个 [关闭]
【发布时间】:2013-06-09 20:15:32
【问题描述】:

我有很多JPanels 和一个JLabel。当我点击一个JPanel 时,我希望我的JLabel(包含一张图片)移动到这个JPanel。这如何通过代码完成?我正在使用 NetBeans 进行编码。

【问题讨论】:

  • 我开始制作象棋游戏之类的东西。国际象棋方块是 64 个 JPanel。我有代表一块的 JLabel(image)。首先,我想知道如何通过单击 JPanel 来在 JPanel 周围移动这个 jlabel ...(抱歉英语不好)
  • 不要移动标签,只是改变它们的图标。
  • 我理解你的意见,但我只想要32个标签(件)
  • 看到这个对你有帮助stackoverflow.com/questions/17008724/…
  • 我希望这个example 能够帮助你,虽然它使用JButton 而不是JPanel :-)

标签: java swing jpanel jlabel mouse-listeners


【解决方案1】:

前提很简单,但实际的解决方案可能取决于您想要实现的目标。

因为一个组件一次只能存在于一个容器中,你只需要担心将它添加到新容器中...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class LabelMover {

    public static void main(String[] args) {
        new LabelMover();
    }

    public LabelMover() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new BasePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class BasePane extends JPanel {

        private JLabel label;

        public BasePane() {
            setLayout(new GridLayout(2, 2));
            MouseHandler handler = new MouseHandler();
            for (int index = 0; index < 4; index++) {
                CellPane pane = new CellPane();
                pane.addMouseListener(handler);
                add(pane);
            }
            label = new JLabel(":)");
            label.setHorizontalAlignment(JLabel.CENTER);
            ((CellPane)getComponent(0)).add(label);
        }

        public class MouseHandler extends MouseAdapter {

            @Override
            public void mousePressed(MouseEvent e) {
                Component source = e.getComponent();
                if (!label.getParent().equals(source)) {
                    ((CellPane)source).add(label);
                    revalidate();
                    repaint();
                }
            }

        }

        public class CellPane extends JPanel {

            public CellPane() {
                setLayout(new BorderLayout());
                setBorder(new LineBorder(Color.GRAY));
            }

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

        }        
    }    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 2017-07-11
    • 2023-03-18
    • 2015-07-22
    相关资源
    最近更新 更多