JavaFX元素在动画之前对齐

时间:2016-11-06 19:23:51

标签: java user-interface javafx fxml

我正在使用JavaFX开发一个用于作业的小型GUI。之前从未使用过JavaFX,我使用或学过的大部分内容都是我自己研究的。我的大多数应用程序运行顺利,包括动画。

我有一个小的用户输入部分:

Small user input GUI

我试图让它在加载下一个场景之前向左滑动,以便给用户留下序列的印象。我使用由TranslationTransitions填充的ParallelTransition实现了这一点,我在其中加载了所有这些节点。

然而,在它动画之前,它似乎将一切正确对齐。

Alignment right before animation

我觉得这与我放置这些物品的容器(AnchorPane)或我未设置的某些未定义属性有关。当我在飞行中学习这一切时,要缩小范围有点困难。任何人都可以给我一个关于是什么导致这个以及如何保持对齐的想法?每个节点以下列方式移动:

namespace GameMaps
{
public class MapPanel : Panel
{
    private Bitmap shownMap = null;
    private Point mapLocation;
    private Size mapSize;
    private bool dragging;
    private Point currentPosition;
    //private Point newPosition;
    private Point initialPosition;
    private Point initialMousePosition;
    private Form1 parentForm;

    public MapPanel(Form1 parentForm) : base()
    {
        this.DoubleBuffered = true;


        this.parentForm = parentForm;

    }
    public MapPanel(Panel targetPanel) : this(new Form1())
    {

    }

    public void ShowMap(Map map)
    {
        if (map == null) return;
        shownMap = map.MapTexture;
        mapLocation = new Point(0, 0);
        mapSize = shownMap.Size;
        currentPosition = new Point();
        initialPosition = new Point();
        initialMousePosition = new Point(); //mapLocation; 

    }
    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.PageUnit = GraphicsUnit.Pixel;
        e.Graphics.PageScale = 1.0F;
        // base.OnPaint(e);
        if (shownMap == null)
        {
            base.OnPaint(e);
            return;
        }
        e.Graphics.DrawImage(shownMap, currentPosition.X, currentPosition.Y);

    }
    protected override void OnMouseDown(MouseEventArgs e)
    {
        // base.OnMouseDown(e);
        if (shownMap == null)
        {
            base.OnMouseDown(e);
            return;
        }
        if (dragging)
        {
            dragging = false;
            return;
        }
        else dragging = true;
        initialPosition.X = currentPosition.X;
        initialPosition.Y = currentPosition.Y;

        initialMousePosition = e.Location;
    }
    protected override void OnMouseMove(MouseEventArgs e)
    {
        /*parentForm.label7.Text = currentPosition.X.ToString();
        parentForm.label8.Text = currentPosition.Y.ToString();
        parentForm.label9.Text = mapSize.Width.ToString();
        parentForm.label10.Text = mapSize.Height.ToString();
        parentForm.label11.Text = Size.Width.ToString();
        parentForm.label12.Text = Size.Width.ToString();*/

        //base.OnMouseMove(e);
        if (!dragging) return;

        currentPosition.X = e.X - initialMousePosition.X + initialPosition.X;
        currentPosition.Y = e.Y - initialMousePosition.Y + initialPosition.Y;

        if (currentPosition.X > 0)
            currentPosition.X = 0;
        else if (currentPosition.X <  -mapSize.Width + Size.Width )
            currentPosition.X =  -mapSize.Width + Size.Width ;
        if (currentPosition.Y > 0)
            currentPosition.Y = 0;
        else if (currentPosition.Y < -mapSize.Height + Size.Height)
             currentPosition.Y = -mapSize.Height + Size.Height;

        //if (currentPosition.X + mapSize.Width < this.Size.Width)
          //  currentPosition.X = this.Size.Width - mapSize.Width;


        Invalidate(); 

     //   (e.X - initialPosition.X + xinit, e.Y - init_loc.Y + yinit);
    }
    protected override void OnMouseLeave(EventArgs e)
    {
        // base.OnMouseLeave(e);
        dragging = false;
        // F*! if I hold the mouse down this does not work
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        //base.OnMouseUp(e);
        dragging = false;
    }
}

如果我遗漏了相关信息,请告诉我们!

1 个答案:

答案 0 :(得分:1)

所以,我的问题结果证明是我布置对象的方式。将它们放置在具有特定属性的任意AnchorPane中以定位这些项目意味着,在动画时,它将对这些对象进行分组并相应地为它们设置动画。这是布置这些节点的错误方法。

相反,我把它们放在一个有两个优点的VBox中。

  1. 我可以对齐那个VBox中心的内容,所以我不需要指定元素的确切布局属性。

  2. 我可以使用单个VBox进行动画处理,而不是ParallelTransition中的所有元素。因此,VBox节点上的单个TranslateTransition就足够了!