I have the following code to move a undecorated swing frame but whenever i press my mouse button the following exception appears:
java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
Here is my Code
class Gui extends Frame
{
JFrame frame;
JLabel label;
Gui()
{
frame = new JFrame();
label = new JLabel("...");
label.setForeground(Color.white);
//label.setBounds(300,300, 100,30);
frame.add(label);
frame.setSize(30, 30);
frame.setUndecorated(true);
frame.setLocation(1550, 1045);
frame.setBackground(new Color(0,0,0,0));
frame.setAlwaysOnTop(true);
frame.setVisible(true);
listenMouse();
}
public void listenMouse()
{
MouseAdapter ma = new MouseAdapter() {
int lastX, lastY;
@Override
public void mousePressed(MouseEvent e) {
lastX = e.getXOnScreen();
lastY = e.getYOnScreen();
}
@Override
public void mouseDragged(MouseEvent e) {
int x = e.getXOnScreen();
int y = e.getYOnScreen();
// Move frame by the mouse delta
frame.setLocation(getLocationOnScreen().x x - lastX,
frame.getLocationOnScreen().y y - lastY);
lastX = x;
lastY = y;
}
};
frame.addMouseListener(ma);
frame.addMouseMotionListener(ma);
}
Could it be that the window is too small or the position where it is is problematic? Is on taskbar already off screen?
CodePudding user response:
Remove extend Frame - you have two window based classes, Gui, which extends from Frame, not a good idea on multiple accounts*, and frame which is an instance of JFrame.
frame.setLocation(getLocationOnScreen().x x - lastX,
frame.getLocationOnScreen().y y - lastY);
is then trying to set the location of the JFrame based on the location of the Frame, which hasn't been realised on the screen.
So, the short answer is, you're confusing yourself.
Frame is an AWT based component and in this context, would not be a good starting point. Extending from top level containers, like Frame is generally discouraged, as you are not adding any new functionality to the class, it locks you into a single use case (reduces re-use) and top level containers tend to be much more complex structures and can really mess with you in ways you might not be expecting
