2016-05-17 2 views
0

Это не столько вопрос, сколько запрос на подтверждение, что а) я не сумасшедший, и б) я не ошибаюсь в своей математике.Java Swing setBounds() выключен на 1 пиксель

Если я рисую прямоугольник (0,0,10,10), верхний левый пиксель (0,0), нижний правый (10,10). Это означает, что каждая строка фактически занимает 11 пикселей так же, как массив с элементами 0 - 10 имеет длину 11.

setBounds (0,0,10,10), с другой стороны, устанавливает верхний левый пиксель в (0,0) и нижний правый пиксель (9,9), который является истинным 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); 
    } 
    } 
} 

ответ

3

При вызове g.drawRect(0,0,10,10) самый правый пиксель обращается будет при х = 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) будет рисовать один пиксель.

Смежные вопросы