2012-12-05 32 views
1

我尝试在Java中绘制一个矩形。我设置了帧大小(800,400)和可调整大小(假)矩形的x = 50,y = 50宽度= 700高度= 300。为什么它不在中间?谢谢。我该如何设置在中间?

+0

其中它位于在屏幕上? –

+2

我把我的钱放在这个窗口的左边缘和上边缘与你的坐标相混淆。你可以张贴截图吗?编辑:另外,这是摆动?如果是这样,你应该重新为它找到最佳的可发现性 – Jeff

+0

我敢打赌你直接在框架上覆盖'paint',这意味着你没有考虑框架的decortations – MadProgrammer

回答

7

没有任何证据,否则,我会猜测你重写的像一个JFramepaint方法和直接画到它。

问题是,帧具有装饰(边框和例如标题栏),这会占用内部框架空间...

enter image description here

技术上讲,这是正确的。该矩形画在框架的中心,但由于框架的装饰,它看起来像它稍高......

相反,你应该画在框架的内容区域。

enter image description here

这里矩形现在看起来正确居中。在我的测试中,我将第一帧(坏)设置为800x400,我将第二帧的内容窗格的首选大小设置为800x400,这使得帧的大小实际上为816x438,因为画面的装饰现在是外部的

public class CenterOfFrame { 

    public static void main(String[] args) { 
     new CenterOfFrame(); 
    } 

    public CenterOfFrame() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       new BadFrame().setVisible(true); 

       JFrame goodFrame = new JFrame(); 
       goodFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       goodFrame.setContentPane(new PaintablePane()); 
       goodFrame.pack(); 
       goodFrame.setLocationRelativeTo(null); 
       goodFrame.setVisible(true); 

      } 
     }); 
    } 

    public class BadFrame extends JFrame { 

     public BadFrame() { 
      setSize(800, 400); 
      setDefaultCloseOperation(EXIT_ON_CLOSE); 
     } 

     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      paintTest(g, getWidth() - 1, getHeight() - 1); 
     } 
    } 

    public void paintTest(Graphics g, int width, int height) { 
     g.setColor(Color.RED); 
     g.drawLine(0, 0, width, height); 
     g.drawLine(width, 0, 0, height); 
     g.drawRect(50, 50, width - 100, height - 100); 
    } 

    public class PaintablePane extends JPanel { 

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

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); //To change body of generated methods, choose Tools | Templates. 
      paintTest(g, getWidth() - 1, getHeight() - 1); 
     } 
    } 
} 

这一点,原因很多,为什么你不应该覆盖顶层容器的paint方法之一;)

0
Rectangle rect = new Rectangle(50,50,700,300); 

这应该可以正常工作,你是否在访问成员变量之前创建一个Rectangle的新实例?

也是800乘400它是一种奇怪的分辨率,800乘600是更标准。