2012-05-06 34 views
2

我以前使用过jframes,从来没有遇到过这个问题,但是当我设置缓冲策略的方式不同(我不完全理解,也可能是这个原因)时,我遇到了这个问题。每当我在我的jframe上输出任何东西时,x坐标完美地匹配jframe(最左边的x像素是0,最右边的x是框架本身的宽度),但是y不是。我使用了一个鼠标移动侦听器来发现我的所有y输出开始比帧高22个像素。例如:(Java)为什么我的JFrame y坐标是22点?

如果我要绘制任何矩形,图像或任何坐标(0,0)......我的图像的最顶部将被切断22个像素。我不是java的专家,我认为没有其他人有这个问题证明,但似乎没有这种情况发生,我已经在2台不同的计算机上试过2个不同的IDE,看它是否我的机器。

我编辑我的代码的批评/无助于问题的“核心”:

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.BufferStrategy; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 

public class Mouse extends JFrame implements KeyListener, MouseListener, MouseMotionListener { 

public static void main(String[] args) { 
    Mouse m = new Mouse(); 
    m.run(); 
} 

public void run(){ 
     init(); 
     while (this.isActive()){ 
      repaint(); 
     } 
} 

BufferStrategy strategy; 
int mPosx; 
int mPosy; 

public void init(){ 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setBounds(100,100,800,600); 
    this.setResizable(false); 
    this.addKeyListener(this); 
    this.addMouseListener(this); 
    this.addMouseMotionListener(this); 
    this.setIgnoreRepaint(true); 
    this.setVisible(true); 
    this.createBufferStrategy(2); 
    strategy = this.getBufferStrategy(); 
} 

public void paint(Graphics g) { 
    Graphics2D g2 = null; 
    if (strategy != null) { 
     try { 
      g2 = (Graphics2D)strategy.getDrawGraphics(); 
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      draw(g2); 
     } 
     finally { 
      g2.dispose(); 
     } 
     strategy.show(); 
    } 
} 

public void draw(Graphics2D g){ 
    g.setColor(Color.DARK_GRAY); 
g.fillRect(580, 30, 120, 90); 
g.setColor(Color.WHITE); 
    g.drawString("Mouse X: " + mPosx, 600, 70); 
g.drawString("Mouse Y: " + mPosy, 600, 90); 
} 

public void keyPressed(KeyEvent e) { 
    switch (e.getKeyCode()){ 
     case KeyEvent.VK_ESCAPE: 
     this.dispose(); 
     break; 
     } 
} 

public void keyReleased(KeyEvent e) {} 
public void keyTyped(KeyEvent e) {} 

public void mouseClicked(MouseEvent e) {} 
public void mouseEntered(MouseEvent e) {} 
public void mouseExited(MouseEvent e) {} 
public void mousePressed(MouseEvent e) {} 

public void mouseReleased(MouseEvent e) { 
    mPosx = e.getX(); 
    mPosy = e.getY(); 
} 

public void mouseDragged(MouseEvent e) { 
} 

public void mouseMoved(MouseEvent e) { 
mPosx = e.getX(); 
mPosy = e.getY(); 
} 
} 

为什么我的y坐标了吗?有人可以更好地写出这些代码并使用正确的y吗?

+0

你的问题是回答?如果是这样,你应该[接受答案](http://meta.stackexchange.com/a/5235)。 –

回答

4

您需要考虑框架的插页。见Container.getInsets()

从的Javadoc:

public Insets getInsets()

确定此容器的insets,它指示容器边框的大小。

例如,一个框架对象有一个与框架标题栏的高度对应的顶部插入。

如果你想画一个组件上,而不必担心插图,移动你的绘图代码的JComponent一个子类,而组件添加到JFrame

final FooComponent c = new FooComponent();  // this is your custom component 
frame.getContentPane().setLayout(new BorderLayout()); 
frame.getContentPane().add(c, BorderLayout.CENTER); 
+0

我还会在run()方法中添加一些关于while循环的内容,这没有任何意义。应该在UI改变时调用repaint()。只要窗口处于活动状态,isActive()将返回true,只要用户点击另一个窗口,循环将退出并不再调用repaint()。 –