2012-05-06 20 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()。 –