Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将组件拖放到背景图像顶部_Java_Swing_User Interface_Drag And Drop - Fatal编程技术网

Java 将组件拖放到背景图像顶部

Java 将组件拖放到背景图像顶部,java,swing,user-interface,drag-and-drop,Java,Swing,User Interface,Drag And Drop,我有一个应用程序,它包含一个填充帧的背景图像,然后在图像顶部拖动一些jlabel。当拖动标签时(标签后面创建了一条轨迹),我很难让背景图像连续且正确地重新绘制,我将背景图像放置在JPanel中,然后在顶部放置一个透明JPanel以用于拖放JLabel。但是,我的jlabel不会出现。如何修改代码以允许将标签拖动到背景图像的顶部 主要类别: public class InteractionBlocks { public static void main(String[] args) {

我有一个应用程序,它包含一个填充帧的背景图像,然后在图像顶部拖动一些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
}
背景面板类:

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);
    }
}

首先,不要覆盖“绘制”。基本上,你所做的是在容器内容物上作画。相反,使用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
布局,因此覆盖窗格没有大小或位置,因此实际上不可见


现在,您可以在背景窗格上使用
边框布局
,或者干脆避免使用“覆盖”窗格,因为我现在看不到它有什么好处。

我很欣赏这两个建议——我忽略了我的面板不是不透明的。但是,JLabel仍然没有出现。还有其他建议吗?不要将鼠标侦听器添加到
组件中,尝试添加到“拖动”面板中,这些点会更有意义……对不起,这并不意味着是意识流,但如果我删除第二个透明的“面板”,然后直接将按钮添加到背景面板中,这一切似乎都会起作用。这种方法有什么缺点吗?因为您使用的是
null
布局,
panel
没有大小或位置,因此它不会“出现”