我有一个应用程序涉及填充框架的背景图像,然后在图像顶部拖动了许多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);
}
}
答案 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
,或者只是避免使用“叠加层”窗格,因为此时我还没有看到任何好处。