2012-05-06 7 views
2

私は以前にjframesを使用していましたが、この問題は一度も起こりませんでしたが、バッファストラテジーを別に設定すると(これは完全に理解できません。私のjframeで何かを出力すると、x座標は完全にjframeにマッチします(一番左のxピクセルは0、一番右のxはフレーム自体の幅です)。マウスの動きリスナを使って、すべてのy出力がフレームよりも22ピクセル高いところから始まることを確認しました。例:(Java)なぜ私のJFrame y座標は22ポイントオフですか?

矩形、画像、または座標(0,0)の任意のものを描画する場合...画像の最上部が正確に22ピクセルだけ切り取られます。私はJavaの専門家ではなく、誰もこの問題を証明していないと思っていますが、このような事例はないようですが、2つの異なるIDE上で2つの異なるIDEを試してみました私のマシン。

私は批判/助けのための問題の「コア」に私のコードを編集した:私のyがオフの座標であるのはなぜ

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で書くことができますか?

+0

ご質問にお答えしますか?もしそうなら、あなたは[回答を受け入れる]べきです(http://meta.stackexchange.com/a/5235)。 –

答えて

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); 
+0

私はrun()メソッドでwhileループについて何かを追加しても意味がありません。 UIが変更されたときに 'repaint()'が呼び出されるべきです。 isActive()は、ウィンドウがアクティブである限りtrueを返します。ユーザが別のウィンドウをクリックすると、ループは終了し、 'repaint()'は呼び出されません。 –

関連する問題