Java – 自定义形状的可拖动JFrame

所以我使用setShape(s);制作了一个自定义形状的JFrame setShape(s); 当我将JFrame设置为未装饰时,我看到了我想要的问题,你不能用鼠标在屏幕上拖动框架,所以我试图实现我自己的可拖动框架,但它不能正常工作,这是Frame类:

 package rt; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Polygon; import java.awt.Shape; import java.awt.event.MouseEvent; import java.io.IOException; import javax.swing.JFrame; import javax.swing.event.MouseInputAdapter; public class MyFrame extends JFrame{ private static final int WIDTH = 1024; private static final int HEIGHT = 1024; private static int [] OCTAGON_COORDS_X = {300, 524, 680, 680, 524, 300, 144, 144}; private static int [] OCTAGON_COORDS_Y = {300, 300, 457, 680, 836, 836, 680, 457}; public MyFrame() throws IOException { // Determine what the default GraphicsDevice can support. GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gd = ge.getDefaultScreenDevice(); boolean isUniformTranslucencySupported = gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT); boolean isShapedWindowSupported = gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSPARENT); if (isUniformTranslucencySupported && isShapedWindowSupported) { setUndecorated(true); setSize(WIDTH, HEIGHT); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); updateFrame(); //setOpacity(0.55f); setVisible(true); MyListener myListener = new MyListener(); addMouseListener(myListener); addMouseMotionListener(myListener); } else { System.err.println("Custom shaped JFrames and trunslucent JFrames are not supported by this device!"); System.exit(0); } } public void updateFrame() { Shape s = new Polygon (OCTAGON_COORDS_X, OCTAGON_COORDS_Y, OCTAGON_COORDS_X.length); setShape(s); } private class MyListener extends MouseInputAdapter { private int initialPressedX; private int initialPressedY; @Override public void mousePressed(MouseEvent e) { initialPressedX = e.getX(); initialPressedY = e.getY(); } @Override public void mouseDragged(MouseEvent e) { updateFrameCoords(e); } void updateFrameCoords(MouseEvent e) { int dx = e.getX() - initialPressedX; int dy = e.getY() - initialPressedY; for (int i = 0; i < OCTAGON_COORDS_X.length; i++) { OCTAGON_COORDS_X[i] += dx; OCTAGON_COORDS_Y[i] += dy; } updateFrame(); } } 

}

主要课程:

 package rt; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { try { MyFrame frame = new MyFrame(); } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } 

}

但是拖动动作并没有按照我的预期运行我认为问题出在这些方面:任何人都在考虑和解释我做错了什么以及如何修复它? 提前致谢 !

我认为你的问题是在执行mouseDragged时担心框架的形状。 我认为你不必担心这一点。

如果您只是将方法更改为以下方法,则可行。 测试一下。

 void updateFrameCoords(MouseEvent e) { setLocation(getLocation().x + e.getX() - initialPressedX, getLocation().y + e.getY() - initialPressedY); } 
  1. 您必须在每次拖动时更新初始坐标
  2. evt.getX()给出相对于帧的坐标。 你应该使用evt.getXOnScreen()来代替。

更换

 void updateFrameCoords(MouseEvent e) { int dx = e.getX() - initialPressedX; int dy = e.getY() - initialPressedY; for (int i = 0; i < OCTAGON_COORDS_X.length; i++) { OCTAGON_COORDS_X[i] += dx; OCTAGON_COORDS_Y[i] += dy; } updateFrame(); } 

 void updateFrameCoords(MouseEvent e) { int dx = e.getXOnScreen() - initialPressedX; int dy = e.getYOnScreen() - initialPressedY; for (int i = 0; i < OCTAGON_COORDS_X.length; i++) { OCTAGON_COORDS_X[i] += dx; OCTAGON_COORDS_Y[i] += dy; } updateFrame(); initialPressedX = e.getXOnScreen(); initialPressedY = e.getYOnScreen(); } 

mousePressed事件中mousePressed

祝好运。