作为参考,这是Mac OS X上的变体外观.注意,
>一个像素的差异表明空间可能用于焦点指示器;但是作为@ Marco13 comments,偶尔的外观暗示了一个(非显而易见的)线程问题.
>由于外观似乎取决于平台,标签会显示操作系统和版本系统属性.
>该示例覆盖getPreferredSize()以建立封闭面板的几何图形,如建议的here.
>如果实现通过填充每个像素来表示opacity property,那么对super.paintComponent()的调用并不是必需的.
> @AyCe的Windows屏幕截图中显示的不规则位置包含@ Marco13建议的线程问题.
Mac OS X:
Windows 7(@AyCe):
Ubuntu 14:
import javax.swing.*;
import java.awt.*;
public class FramePackBug {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
JFrame window = new JFrame("Buggy");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setResizable(false);
window.setBackground(Color.RED);
JPanel jp = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.GREEN);
g.fillRect(0, 0, getWidth(), getHeight());
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 100);
}
};
window.add(jp);
window.add(new JLabel(System.getProperty("os.name") + ", "
+ System.getProperty("os.version")), BorderLayout.NORTH);
window.pack();
window.setLocation((i % 5) * (window.getWidth() + 5),
(i / 5) * (window.getHeight() + 5) + 20);
window.setVisible(true);
}
}
});
}
}