Java Swing setBounds()关闭1像素

Java Swing setBounds()关闭1像素,java,swing,Java,Swing,这与其说是一个问题,不如说是一个要求确认a)我没有疯,b)我没有做错数学的请求 如果我画一个矩形(0,0,10,10),左上角是像素(0,0),右下角是(10,10)。这意味着每行实际占用11个像素,就像元素为0-10的数组长度为11一样 另一方面,setBounds(0,0,10,10)将左上角像素设置为(0,0),右下角像素设置为(9,9),这是一个真正的10像素x 10像素框 实际含义是不能在10宽的组件内绘制10宽的矩形,因为10宽的矩形实际上是11宽的,并且最右边的像素将被截断。是这样

这与其说是一个问题,不如说是一个要求确认a)我没有疯,b)我没有做错数学的请求

如果我画一个矩形(0,0,10,10),左上角是像素(0,0),右下角是(10,10)。这意味着每行实际占用11个像素,就像元素为0-10的数组长度为11一样

另一方面,setBounds(0,0,10,10)将左上角像素设置为(0,0),右下角像素设置为(9,9),这是一个真正的10像素x 10像素框

实际含义是不能在10宽的组件内绘制10宽的矩形,因为10宽的矩形实际上是11宽的,并且最右边的像素将被截断。是这样吗

下面的代码通过在460宽的组件内创建一个460宽的矩形来演示该行为

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.ArrayList;

public class TestBox extends JPanel {
  public static void main(String[] args){
    JFrame window = new JFrame("TestBox");
    TestBox content = new TestBox();
    window.setContentPane(content);
    window.pack();
    Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
    window.setLocation( (screensize.width - window.getWidth())/2,
                        (screensize.height - window.getHeight())/2 );
    window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    window.setResizable(false);  
    window.setVisible(true);
  }
  private Box box;
  public TestBox(){
    setLayout(null);
    setPreferredSize( new Dimension(500,500) );
    setBackground(new Color(200,200,200));
    box = new Box();
    add(box);
    box.setBounds( 20, 20, 460, 460 );
  }
  private class Box extends JPanel {
    public void paintComponent( Graphics g ){
      g.setColor(Color.BLACK);
      g.drawRect( 0, 0, 460, 460 );
    }
  }
}

调用
g.drawRect(0,0,10,10)
时,最右边的绘制像素将位于x=9,因此右下角的绘制像素位于(9,9),而不是(10,10)。考虑<代码> G.DRACORT(0,0,1,1)< /代码>。这将在坐标(0,0)处绘制单个像素

哦,对不起。我想到的是g.fillRect(),而不是g.drawRect()。是的,您是对的,正如您可以演示的那样,如果将背景设置为绿色,将面板大小设置为3,3,然后将颜色设置为红色和g。drawRect(0,0,2,2)您将使用一个红色正方形和一个中心绿色像素-右下角的红色像素位于(2,2)


更重要的是,g.drawRect(0,0,0,0)将绘制一个像素。

当调用
g.drawRect(0,0,10,10)
时,最右侧绘制的像素将位于x=9,因此右下角绘制的像素位于(9,9),而不是(10,10)。考虑<代码> G.DRACORT(0,0,1,1)< /代码>。这将在坐标(0,0)处绘制单个像素

哦,对不起。我想到的是g.fillRect(),而不是g.drawRect()。是的,您是对的,正如您可以演示的那样,如果将背景设置为绿色,将面板大小设置为3,3,然后将颜色设置为红色和g。drawRect(0,0,2,2)您将使用一个红色正方形和一个中心绿色像素-右下角的红色像素位于(2,2)

更重要的是,g.drawRect(0,0,0,0)将绘制单个像素