自定义绘画JPanel抵消了绘图

时间:2014-09-28 16:02:57

标签: java jframe jpanel paint paintcomponent

我在Windows 8.1上使用Netbeans(JDK 1.7)来运行以下应用程序:

  • 在400x400 Graphics的{​​{1}}中使用paintComponent()对象draw a frog;
  • 将面板添加到JPanel以进行显示;

当然,这应该是一项非常简单的任务,但我无法理解此应用程序中的特定行为。

以下是问题:第一次显示窗口时,面板显示偏移(下图),不应该显示。我试图理解为什么会这样,以及如何解决它:

在键盘上按下其中一个箭头键后,图形向左/右/向上/向下移动5个像素。但是,当发生这种情况时,整个JFrame似乎被移动到窗口的(0,0)坐标(这是我从一开始就预期的那样),因此移动绘图比它应该的要多得多:

我在面板的边缘画了一个黑色边框,使问题更加明显。

以下是Short, Self Contained, Correct (Compilable), Example

KAfrog.java

JPanel

Window.java

import javax.swing.SwingUtilities;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class KAfrog
{        
    public static void main( String args[] ) 
    {                        
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        }  // end of anonymous innerclass
        ); // end of invokeLater    
    }    

    private static void createAndShowGUI() 
    {
        System.out.println("Created GUI on EDT? " + SwingUtilities.isEventDispatchThread());

        Window janela = new Window("Khan Academy Frog");        
        janela.addWindowListener( new WindowAdapter() {
            public void windowClosing(WindowEvent e) 
            {
                System.exit(0);
            } 
        }  // end of anonymous innerclass
        ); // end of addWindowListener               
    }    
}

有谁知道为什么会发生这种情况以及如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

你从javax.wall.JComponent。

覆盖public int getX()

它返回组件原点的当前x坐标。此方法比编写component.getBounds()。x或component.getLocation()。x更可取,因为它不会导致任何堆分配。

重命名您的方法 public int getX() public int getY()

这应解决问题。