在背景图像顶部拖放组件

时间:2014-01-22 18:16:27

标签: java swing user-interface drag-and-drop

我有一个应用程序涉及填充框架的背景图像,然后在图像顶部拖动了许多JLabel。拖动标签(在标签后面创建了一条线索)时,我无法连续正确地重绘背景图像,我将背景图像放在JPanel中,然后在顶部放置一个透明的JPanel用于拖放JLabel 。但是,我的JLabel没有出现。如何修改我的代码以允许在背景图像上拖动标签?

主要班级:

public class InteractionBlocks {

    public static void main(String[] args) {

        BlocksFrame frame = new BlocksFrame();
        frame.setVisible(true);
        frame.setSize(1000, 650); //full size is 8000, 5000
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

BlocksFrame类:

@SuppressWarnings("serial")
public class BlocksFrame extends JFrame implements MouseListener, MouseMotionListener {

    private JPanel panel = new JPanel(null);
    private BackgroundPanel backgroundPanel = new BackgroundPanel(null);
    private boolean drag = false;

    //Block is a JLabel with additional information stored
    private Block qa = new Block(Pattern.QUESTION_ANSWER, Actor.HUMAN);

    public BlocksFrame() {
        this.add(backgroundPanel);
        panel.setOpaque(true);
        backgroundPanel.add(panel);

        addButtons();
    }

    private void addButtons() {     
        panel.add(qa);
        qa.setBounds(100, 50, qa.getIcon().getIconWidth(), qa.getIcon().getIconHeight());
        qa.addMouseMotionListener(this);
        qa.addMouseListener(this);
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        if (drag == true) {
            JComponent jc = (JComponent) e.getSource();
            jc.setLocation(jc.getX() + e.getX(), jc.getY() + e.getY());
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {        
        drag = true;
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        ((Block) e.getSource()).setLocation(((Block) e.getSource()).getX(), 300);

        drag = false;
    }

    //additional @Override methods that are empty
}

BackgroundPanel类:

public class BackgroundPanel extends JPanel {

    public BackgroundPanel(LayoutManager mngr) {
        super(mngr);
    }

    public void paint(Graphics g) {
        super.paint(g);
        ImageIcon background = new ImageIcon("./figures/ui_new.png");
        g.drawImage(background.getImage(), 0, 0, null);
    }
}

1 个答案:

答案 0 :(得分:2)

首先,不要覆盖油漆。基本上你正在做的是在容器内容上绘画。而是使用paintComponent

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    ImageIcon background = new ImageIcon("./figures/ui_new.png");
    g.drawImage(background.getImage(), 0, 0, null);
}

您的“面板”也不透明,请尝试使用...

panel.setOpaque(false);

其他

由于您在背景窗格和“叠加层”窗格上都使用了null布局,因此叠加窗格没有大小或位置,因此无法实现隐藏。

现在,您可以在背景窗格上使用BorderLayout,或者只是避免使用“叠加层”窗格,因为此时我还没有看到任何好处。