【问题标题】:JFrame.pack() containing a few Graphics2D objects blocks visibility of contained objects包含一些 Graphics2D 对象的 JFrame.pack() 会阻止包含对象的可见性
【发布时间】:2012-05-11 03:41:19
【问题描述】:

我有一个包含一些简单形状的 JFrame,它们是 Ellipse2D。我希望框架调整大小以紧贴尺寸为(240, 240) 的对象

当我打包 JFrame 时,它​​的大小已调整为最小窗口大小,而不是包含的对象的大小。

我还应该说,如果我在 JFrame 上使用 setSize(240, 240),它会设置外部窗口大小,而不是所包含对象的大小,因此 Windows UI 会覆盖所包含 Graphics2D 对象的一半。

如何根据所包含的 Graphics2D 对象的大小调整 JFrame 的大小。我看到他们没有 setPreferredSize() 方法,这使得这变得异常复杂。

    import java.awt.Color;
import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.geom.Ellipse2D;

    import javax.swing.JFrame;
import javax.swing.JPanel;

    public class GUIMain extends JPanel{

        private int maxwidth = 240;

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(maxwidth, maxwidth);
        }

        @Override
        public void paintComponent( Graphics g )
        {
            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            float i;
            float imax = 4;
            Ellipse2D.Double circle = new Ellipse2D.Double();

            for( i = imax; i > 0; i--){
                circle.width = (int)maxwidth*(i/imax);
                circle.height = (int)maxwidth*(i/imax);
                circle.x = (maxwidth/2)-(circle.width/2);
                circle.y = (maxwidth/2)-(circle.width/2);

                if((i % 2) == 0){
                    g2d.setColor(Color.red);
                }else{
                    g2d.setColor(Color.blue);
                }
                g2d.fill(circle);
            }
        }

        public static void main(String[] args) {

            JFrame frame = new JFrame("Lame...");
            frame.add(new GUIMain());
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //frame.setSize(maxwidth, maxwidth);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
            frame.setResizable(false);
        }

    }

编辑:好的,现在我已经修改了上面的代码。除了窗口出现在 12px 底部右侧的填充之外。看起来像这样。

http://i.imgur.com/Ilp39.jpg

【问题讨论】:

    标签: java swing jframe graphics2d paintcomponent


    【解决方案1】:

    您可能不是直接在 JFrame 中绘制 Ellipse2D 对象,而是在 JFrame 显示的 JPanel 的 paintComponenet(...) 方法中绘制。您将需要覆盖此 JPanel 的 getPreferredSize(),以便它计算并返回允许显示所有椭圆的 Dimension。

    【讨论】:

    • 我将编辑顶部以显示其余代码减去我正在绘制的形状。
    • @Supernovah:在查看了您发布的代码之后,我的建议保持不变,除了您应该再次覆盖 JPanel 的 paintComponent(...) 方法,而不是它的 paint(...) 方法,除非您想放弃所有的好处摆动图形。
    • 正如您在三个连续注释掉的行中看到的那样,应该设置框架的首选大小吗?强制为(240, 240)。但它仍然将外部尺寸设置为(240, 240) 而不是内部尺寸。
    • @Supernovah:再次,不要设置JFrame的preferredSize。 再次,覆盖 JPanel 的 getPreferredSize()
    • 好的,怎么样?抱歉,我才刚开始 Java 编码的第一个小时 -_-
    猜你喜欢
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多