正如标题所示,我的问题是我希望能够拖动图像
在这种特定情况下,我想将图像从一个JPanel(或者更确切地说是我自己的子类)拖到另一个(不同的)JPanel子类中。因此,我在我的JPanel子类中添加了MouseListener
,因此在单击面板中的某个区域时,会选择在JFrame(子类)上绘制图像。这是一些代码,所以你会理解我的问题:
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
if (x >= 10 && x < 42 && y >= 10 && y < 42) {
image = barracks; //barracks is a predefined image, created in the constructor
dragBuilding = true;
PixelMain.pixelMain.repaint(); //pixelMain is an instance of the JFrame subclass
}
}
//irrelevant code, e.g mouseMoved, ...
public void mouseDragged(MouseEvent e) {
if (dragBuilding) {
//System.out.println("GPanel mouseDragged");
PixelMain.pixelMain.repaint();
}
}
JFrame子类只包含构造函数和以下代码:
public void paint(Graphics g) { //i would have used paintComponent, but it seems like JFrame does not have this method ...?
super.paint(g);
if (PixelMain.panelOffense.getDragBuilding()) { //panelOffense is an instance of the JPanel subclass, getDragBuilding returns a boolean that depends on whether the mouse is held down at the moment
Graphics2D g2 = (Graphics2D) g;
Rectangle2D tr = new Rectangle2D.Double((int)getMousePosition().getX(), (int)getMousePosition().getY(), 16, 16); //size of the texture
TexturePaint tp = new TexturePaint(PixelMain.panelOffense.getImg(), tr);
g2.setPaint(tp);
Rectangle2D r = (Rectangle2D) new Rectangle((int)getMousePosition().getX(), (int)getMousePosition().getY(), 16, 16); //area to fill with texture
g2.fill(r);
System.out.println("test");
}
}
在你问之前 - 我确实将一些代码移到了其他类中,因此它的调用次数较少,但这不是问题所在。即使paint方法只绘制一个矩形(直接在Graphics g上,而不是Graphics2D上),矩形也会闪烁 如果有人能帮我找出解决方案,我会非常感激!
注意:我知道在JFrame或JFrame的子类上绘制可能不是很优雅,但我个人不知道其他选择。
注意2:根据我读过的google / stackoverflow结果或线程,我应该使用JPanel,它似乎是双缓冲的(不管是什么,我真的不明白。但是再说一次,这几乎是晚上11点了)。因此,我可能会将所有组件移动到JPanel来解决问题,但我想尝试解决问题而不这样做。
注3:是的,代码属于我正在编写的(策略)游戏,但考虑到问题与游戏开发并不完全相关,我决定在此处发布,而不是在游戏开发堆栈交换。