Java 将组件拖放到背景图像顶部
我有一个应用程序,它包含一个填充帧的背景图像,然后在图像顶部拖动一些jlabel。当拖动标签时(标签后面创建了一条轨迹),我很难让背景图像连续且正确地重新绘制,我将背景图像放置在JPanel中,然后在顶部放置一个透明JPanel以用于拖放JLabel。但是,我的jlabel不会出现。如何修改代码以允许将标签拖动到背景图像的顶部 主要类别: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) {
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
没有大小或位置,因此它不会“出现”