我有一个简单的电梯模拟器。该模拟器的绘画类在左侧绘制一堵墙,在右侧绘制一堵墙-都是Line2D对象。中心是代表机舱的矩形。
我的成员变量是:
private PaintableElevator paintableObject;
private Line2D wallLeftSide = new Line2D.Double();
private Line2D wallRightSide = new Line2D.Double();
private Rectangle2D elevator = new Rectangle2D.Double();
paintableObject给出按比例绘制位置的信息。例如,如果说机舱的高度为0.1,则其在面板上的高度为:this.getHeight * 0.1
我还有一个组件侦听器,它对rezize Events的反应如下:
@Override
public void componentResized (ComponentEvent e)
{
wallLeftSide.setLine(new Point2D.Double(0, changeYCoordsOrigin(getHeight() * paintableObject.getTotalHeight())), new Point2D.Double(0, getWidth()));
wallRightSide.setLine(new Point2D.Double(getWidth(), changeYCoordsOrigin(getHeight() * paintableObject.getTotalHeight())), new Point2D.Double(getWidth(), getHeight()));
elevator.setRect(0, changeYCoordsOrigin(getHeight() * paintableObject.getHeightInShaft()), getWidth(), paintableObject.getCabinHeight() * getHeight() *-1);
}
我的问题是Graphics 2D将其坐标的原点设置在左上角。我希望它位于按钮的左侧。那就是为什么我使用我的方法changeYCoordOrigin()
public double changeYCoordsOrigin (double coord)
{
return getHeight() - coord;
}
我希望我可以通过计算坐标减去当前高度来转换坐标。那行得通。但是,当我想为矩形设置负高度时,我的组件什么也不显示。
但这非常重要,因为我想通过以下代码驾驶我的小木屋:
@Override
public void setHeigth (double height)
{
elevator.setRect(0, getHeight() * height, getWidth(), paintableObject.getCabinHeight());
repaint();
}
当只是不使用changeYCoordOrigin
并使用正高度时,我想乘电梯时电梯会驶下。因此,更改坐标原点或对其进行模拟非常重要。
我的绘画方法只是绘画那些对象:
@Override
public void paint (Graphics g)
{
if (g instanceof Graphics2D)
{
Graphics2D g2 = (Graphics2D) g;
g2.draw(wallLeftSide);
g2.draw(wallRightSide);
g2.setBackground(Color.gray);
g2.draw(elevator);
}
}