2

以前にjframesを使用したことがあり、この問題は一度もありませんでしたが、バッファ戦略を別の方法で設定すると(完全には理解できず、おそらくこれの原因です)、この問題が発生します。jframeに何かを出力するたびに、x座標はjframeと完全に一致します(左端のxピクセルは0、右端のxはフレーム自体の幅です)が、yは一致しません。マウス モーション リスナーを使用して、すべての y 出力がフレームよりも 22 ピクセル高く開始されることを確認しました。例:

長方形、画像などを座標 (0,0) に描画すると、画像の最上部が正確に 22 ピクセル分切り取られます。私はJavaの専門家ではありません.誰もこの問題を抱えていないことを証明していると思います.私のマシン。

批判/ヘルプのために、コードを問題の「核心」に編集しました。

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 で記述できますか?

4

1 に答える 1

4

フレームのインセットを考慮する必要があります。を参照してくださいContainer.getInsets()

Javadoc から:

public Insets getInsets()

コンテナーの境界線のサイズを示す、このコンテナーのインセットを決定します。

たとえば、Frame オブジェクトには、フレームのタイトル バーの高さに対応する上部インセットがあります。

コンポーネントに描画したいがインセットを気にする必要がない場合は、描画コードを のサブクラスに移動し、JComponentそのコンポーネントを に追加しますJFrame

final FooComponent c = new FooComponent();     // this is your custom component
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(c, BorderLayout.CENTER);
于 2012-05-06T02:15:24.727 に答える