(Java)为什么我的JFrame y坐标22点?

时间:2012-05-06 01:34:08

标签: java swing jframe coordinates

我以前使用过jframes并且从未遇到过这个问题,但是当我以不同的方式设置缓冲区策略时(我不完全理解并且可能是导致此问题),我遇到了这个问题。每当我在我的jframe上输出任何东西时,x坐标就完美地匹配jframe(最左边的x像素是0,最右边的x是框架本身的宽度),但是y没有。我使用鼠标运动监听器来确定我的所有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编写此代码吗?

1 个答案:

答案 0 :(得分:4)

您需要考虑框架的插图。请参阅Container.getInsets()

来自Javadoc:

  

public Insets getInsets()

     

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

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

如果要绘制组件而不必担心插入,请将绘图代码移动到JComponent的子类,并将该组件添加到JFrame

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