使用fillRect在JFrame内绘制JPanel - 矩形大小和位置问题?

时间:2016-09-27 13:11:08

标签: java swing jframe jpanel

编辑:修正了代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Dimension;


public class JumpingBall extends JPanel{
@Override
public Dimension getPreferredSize()
{
    return new Dimension(300,300);
}


public void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D rectangle = (Graphics2D) g;
    rectangle.setColor(Color.BLACK);
    rectangle.fillRect(0,270,300,30);
}


public static void main(String[] args) {
    JFrame frame = new JFrame("Jumping Ball");


    frame.getContentPane().add(new JumpingBall());
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
}
}

我已经设定了自己编写一些代码的任务,这些代码简单地使用户命令从地板上跳起球。第一步是创建一个窗口和一个楼层 - 我注意到我添加我的楼层的位置往往偏离屏幕并发现here frame.setSize(x,y)包含边框,你应该嵌入一个JPanel在框架内部和尺寸相反。但是,在尝试进行这些更改时,无论变量如何,我的rectangle.fillRect(x,y,width,height)似乎都显示为一个小的方形顶部中心。为什么会发生这种情况?

代码:

    import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Dimension;

public class JumpingBall extends JPanel{
    public void paint(Graphics g){
        Graphics2D rectangle = (Graphics2D) g;
        rectangle.setColor(Color.BLACK);
        rectangle.fillRect(0,0,300,30);
    }

public static void main(String[] args) {
    JFrame frame = new JFrame("Jumping Ball");
    JPanel panel = new JPanel();

    panel.setPreferredSize(new Dimension(300,300));
    panel.add(new JumpingBall());

    frame.getContentPane().add(panel);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
}
}

Here's a screenshot of my failed floor.

1 个答案:

答案 0 :(得分:2)

进行自定义绘画时:

  1. 您应该覆盖paintComponent()而不是paint()并调用super.paintComponent(g)作为确保背景被清除的第一个语句。

  2. 重写类的getPreferredSize()方法以返回面板的大小,以便布局管理器可以完成这项工作。所以在你的情况下它应该是(300,300)。

  3. 在您的代码中,您不应该设置任何组件的首选大小。布局管理器的工作是确定组件的首选大小。

    panel.setPreferredSize(new Dimension(300,300));
    

    您当前设置了持有跳球的面板的首选大小。这没有帮助,因为尚未设置跳球的首选尺寸。您会看到(10,10)方格,因为面板的FlowLayout确定跳球面板的首选大小仅为(10,10)。

    此外,无需创建单独的面板。您可以直接将JumpingBall面板添加到框架中。