当前位置: 首页 > 知识库问答 >
问题:

Java Swing绘制矩形是否不符合预期?

水麒
2023-03-14

我试着在中心放置一些矩形。但画的位置不对。我的代码

import javax.swing.JPanel;

public class Canvas extends JPanel {
    
    Player player = new Player(this);
    
    public Canvas() {
        //setBackground(Color.blue);
        setBounds(270, 0, 1230, 1000);
        setLayout(null);
    }
    
    public void start() {
        int FPS = 60;
        double drawIinterval = 1000000000/FPS;
        double delta = 0;
        long lastTime = System.nanoTime();
        long currentTime;
        long timer = 0;
        int drawCount = 0;
        while(true) {
            
            currentTime = System.nanoTime();
            
            delta += (currentTime -lastTime) / drawIinterval;
            timer += (currentTime -lastTime);
            lastTime = currentTime;
            
            if(delta >= 1) {
                update();
                repaint();
                delta--;
                drawCount++;
            }
            
            if(timer >= 1000000000) {
                System.out.println("FPS: " + drawCount);
                drawCount = 0;
                timer = 0;
            }
            
        }
    }
    
      private void update() {
        
          player.update();
        
    }

    @Override
      public void paintComponent(Graphics g) {
          super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            
            player.draw(g2);
            
            g2.drawRect(size().width/2 - 100/2 ,size().height/2 - 100/2, 100, 100);
      }
}

我还试着把它放在右边的边界旁边

g2.drawRect(size().width - 100 ,size().height - 100, 100, 100);

但这将其置于边界内。只要把它放在左边或上面就行了。有什么解释吗?

编辑:当试图画一条线通过整个面板

g2.drawLine(0, 0, size().width, size().height);

它没有到达下角,只在底部之前输入大约20个像素。

共有1个答案

柳镜
2023-03-14

线条不走到角落的原因一定与显示画布的窗口有关。我修改了你的代码,这样它就可以渲染线条,这就是我得出的结论。这条线一直延伸到拐角处。

这是我对您的代码的版本。

import java.awt.*;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Canvas extends JPanel
{
    private static final long serialVersionUID = 1L;

    public Canvas()
    {
        setBackground(Color.blue);
        setForeground(Color.white);
        setBounds(270, 0, 1230, 1000);
        setLayout(null);
    }


    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;

//      g2.drawRect(size().width / 2 - 100 / 2, size().height / 2 - 100 / 2, 100, 100);
        g2.setStroke(new BasicStroke(3));
        g2.drawLine(0, 0, size().width, size().height);
}

    public static void main(String args[])
    {
        JFrame frame = new JFrame();
        Canvas canvas = new Canvas();
        frame.setLayout(new BorderLayout());
        frame.add(canvas, BorderLayout.CENTER);
        frame.setBounds(100, 100, 500, 500);
        frame.setVisible(true);
    }
}

你可以在画布周围画一个矩形来证明这个想法。

    g2.drawRect(0, 0, getWidth()-1, getHeight()-1);

一个真正简单的方法来帮助你找出是什么占用了额外的空间是添加系统输出或日志记录到绘图组件

        System.out.println(this);

在我的例子中,当我调整画布大小时,它会向我显示可见的Rect。

Canvas[,0,0,468x412,alignmentX=0.0,alignmentY=0.0,border=,flags=11,maximumSize=,minimumSize=,preferredSize=]
Canvas[,0,0,468x411,alignmentX=0.0,alignmentY=0.0,border=,flags=11,maximumSize=,minimumSize=,preferredSize=]
Canvas[,0,0,468x410,alignmentX=0.0,alignmentY=0.0,border=,flags=11,maximumSize=,minimumSize=,preferredSize=]
Canvas[,0,0,469x410,alignmentX=0.0,alignmentY=0.0,border=,flags=11,maximumSize=,minimumSize=,preferredSize=]
...
 类似资料:
  • 使用closePath()闭合图形 首先我们用上节课的方法绘制一个矩形。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UT

  • 各位程序员好, 我在代码中遇到了一个似乎无法破解的小问题。它与Java的Jframe;图形区域有关。我将在下面发布的代码是在一个绘图方法上。其目的是绘制ArrayList中的房间,该房间位于另一个类中,因此之前。这种偏离航线的情况不会发生,因此在这里发帖。 获取有关该项目的背景信息是ArrayList,其中包含各种不同大小和颜色的房间。房间本身就是物体。 首先是课程: 下面是用于创建房间的类。 我

  • 绘制矩形        点击菜单栏中的“绘制矩形”按钮可以绘制矩形,绘制矩形在数据下载的时候经常要用到,绘制矩形操作及信息与绘制面相同。 修改矩形        添加后可以使用“选中对象”后双击更改面的样式,也可右键“属性”修改线的属性信息。点击属性信息框下方的整体移动(单点修改)键对面进行位置的更改。在“空间信息”栏修改矩形的节点坐标后,需要注意的是修改完可能就不是标准矩形了,要调整。 删除矩形

  • 绘制矩形        点击菜单栏中的“绘制矩形”按钮可以绘制矩形,绘制矩形在数据下载的时候经常要用到,绘制矩形操作及信息与绘制面相同。 修改矩形        添加后可以使用“选中对象”后双击更改面的样式,也可右键“属性”修改线的属性信息。点击属性信息框下方的整体移动(单点修改)键对面进行位置的更改。在“空间信息”栏修改矩形的节点坐标后,需要注意的是修改完可能就不是标准矩形了,要调整。 删除矩形

  • 上一节,我们使用lineTo()方法绘制一个封闭的矩形。其实,canvas的API提供了rect()方法可以绘制矩形。rect()方法是路径方法,它会把指定的矩形添加到当前路径的子路径中。它只添加路径,绘制图形还是由stroke()或fill()方法完成。 除了rect()方法之外,Canvas 的API还提供了三个直接处理矩形的方法: fillRect(x, y, width, height)

  • 本节,我们将学习如何绘制矩形,它也是HTML5的画布API唯一所提供的内置图形。矩形看上去可能不会让你感到兴奋,但是许多应用程序还是以某种方式在使用它,所以你也应该了解它。 图2-1 绘制矩形 绘制步骤 按照以下步骤,在画布的中央绘制一个简单的矩形: 1. 定义2D画布上下文: window.onload  = function(){ var canvas  = document.getEl