Java – bug about getbounds () and setbounds () on Linux_ Solution with id = 4806603?
On Linux platform, frame:: getbounds and frame:: setbounds cannot work consistently This was in 2003 (!) Report, see here:
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4806603
For convenience, I simplified the declaration code that caused the error and pasted it as:
import java.awt.Button; import java.awt.Frame; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** Demonstrates a bug in the java.awt.Frame.getBounds() method. * @author Mirko Raner,PTSC * @version 1.0 (2003-01-22) **/ public class GetBoundsBug extends Frame implements ActionListener { public static void main(String[] arg) { GetBoundsBug frame = new GetBoundsBug(); Button button = new Button("Click here!"); button.addActionListener(frame); frame.add(button); frame.setSize(300,300); frame.setVisible(true); } @Override public void actionPerformed(ActionEvent event) { Rectangle bounds = getBounds(); bounds.y--; setBounds(bounds); bounds.y++; setBounds(bounds); } }
Unexpected behavior: the window moves slightly after clicking the button! (28 pixels per click on my system.)
This is a screen recording: @ L_ 419_ 2@
This behavior has existed for 13 years, so the official may not change
Does anyone have a solution to this bug? Specifically, I want to reliably store and restore the previous window / frame / dialog box on all platforms
PS: my java installation is jdk1 8.0_ 102 for Oracle AMD64 on Ubuntu 16 Linux Since I recently migrated from windows to Ubuntu, I know that on windows, the above code works as expected
Using swingworker to adapt to swing will produce the same effect:
import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.SwingWorker; public class GetBoundsBug extends JFrame implements ActionListener { public static void main(String[] arg) { GetBoundsBug myJFrame = new GetBoundsBug(); JButton myJButton = new JButton("Click here!"); myJButton.addActionListener(myJFrame); myJFrame.setContentPane(myJButton); myJFrame.setSize(300,300); myJFrame.setVisible(true); } @Override public void actionPerformed(ActionEvent event) { SwingWorker<Void,Void> mySwingWorker = new SwingWorker<Void,Void>() { @Override public Void doInBackground() { Rectangle myRectangle = getBounds(); myRectangle.y--; setBounds(myRectangle); myRectangle.y++; setBounds(myRectangle); return null; } }; mySwingWorker.execute(); } }
Solution
Well, in the original bug database entry, this is marked "irreparable" and interpreted as a quirk in the window manager, not JDK
What window manager are you using?