gpt4 book ai didi

java - (Java) 为什么我的 JFrame y 坐标偏移了 22 点?

转载 作者:行者123 更新时间:2023-11-30 07:26:16 27 4
gpt4 key购买 nike

我以前使用过 jframes 并且从未遇到过这个问题,但是当我以不同的方式设置我的缓冲区策略时(我不完全理解这可能是这个问题的原因),我遇到了这个问题。每当我在我的 jframe 上输出任何东西时,x 坐标与 jframe 完美匹配(最左边的 x 像素是 0,最右边的 x 是框架本身的宽度),但 y 不是。我使用鼠标运动监听器来确定我所有的 y 输出都比帧高 22 像素。示例:

如果我要在坐标 (0,0) 处绘制任何矩形、图像或其他任何内容...我的图像的最顶部将被恰好截去 22 个像素。我不是 Java 专家,我认为没有其他人遇到过这个问题证明了这一点,但似乎没有发生过这种情况,我已经在两台不同的计算机上尝试了 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 更好地编写这段代码吗?

最佳答案

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

来自 Javadoc:

public Insets getInsets()

Determines the insets of this container, which indicate the size of the container's border.

A Frame object, for example, has a top inset that corresponds to the height of the frame's title bar.

如果你想在一个组件上绘图而不用担心插入,将你的绘图代码移动到 JComponent 的子类中,并将该组件添加到 JFrame.

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

关于java - (Java) 为什么我的 JFrame y 坐标偏移了 22 点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10467403/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com