簡體   English   中英

Java Swing setBounds()關閉1個像素

[英]Java Swing setBounds() off by 1 pixel

這不是一個要求確認的問題,它是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.drawRect( 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)將繪制一個像素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM