Как я могу заставить объект медленно двигаться слева направо?

Вы создали один элемент, а затем пытаетесь вставить его в два разных места. Вы должны сделать два элемента, а затем вставить их оба.

#addNode {
  margin-left: 20px;
  width: 20%;
  height: 20px;
  font-weight: bold;
}

#deleteNode {
  margin-right: 20px;
  width: 20%;
  height: 20px;
  font-weight: bold;
}

#txtInput {
  width: 50%;
  height: 10px;
  float: left;
  padding: 10px;
}

#srcNodes {
  width: 40%;
  font-family: courier new;
  padding: 10px;
}

#targetNodes {
  width: 40%;
  font-family: courier new;
  padding: 10px;
}
<textarea id="addNodeInput" placeholder="Node Name"></textarea>
<button id="addNode" onclick="addNode();">Add</button>
<button id="deleteNode" onclick="deleteNode();">Delete</button>
<div id="nodeConsole"></div>

<select id="srcNodes" size="8"> </select>
<select id="targetNodes" size="8"> </select>

<script>
  var cmd = "";

  var inNode = document.getElementById("addNodeInput");
  var out = document.getElementById("nodeConsole");

  function display() {
    out.value = "Node Operations";
    out.innerHTML = cmd + out.innerHTML;
    cmd = "";
  }


  function addNode() {
    var n = inNode.value;
    cmd = ">>>" + n + "<br />";
    //display(cmd);
    inNode.value = "";
    inNode.focus();
    var s = document.getElementById("srcNodes");
    var t = document.getElementById("targetNodes");
    var option1 = document.createElement("option");
    var option2 = document.createElement("option");

    option1.text = n;
    option2.text = n;
    s.add(option1);
    t.add(option2);

  }
</script>

-2
задан Makoto 18 January 2019 в 21:51
поделиться

1 ответ

Измените метод movement, чтобы просто обновить дельту

public void movement(){
            x_position = x_position +10;
}

Удалите вызов movement из вашего метода paintComponent

Обновите вас Timer для вызова movement method

Timer timer = new Timer(50, e -> {
        canvas.movement();
        canvas.repaint();
 });

и как насчет операторов if, где, если версия исчезает с экрана, она возвращается к началу? я должен был бы сделать отдельный метод для проверки? и если так, я бы назвал это в графике или в таймере? Спасибо

Вы продолжаете задавать этот вопрос, и вы продолжаете получать один и тот же ответ, я не уверен, что вы ожидаете изменить.

Я бы подумал использовать что-то вроде , например, , которое просто рисует «переполнение» изображения, чтобы заполнить оставшееся пространство, или , например, или даже , это пример , который использует BufferedImage#getSubImage, что, вероятно, более эффективно.

Основываясь на первых двух примерах, вы также можете сделать что-то вроде ...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                BufferedImage background = new BufferedImage(800, 200, BufferedImage.TYPE_INT_RGB);
                Graphics2D g2d = background.createGraphics();
                g2d.setColor(Color.WHITE);
                g2d.fillRect(0, 0, 800, 200);
                g2d.setColor(Color.RED);
                g2d.drawLine(0, 0, 800, 200);
                g2d.drawLine(0, 200, 800, 0);

                JFrame frame = new JFrame();
                frame.add(new RenderPane(background));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class RenderPane extends JPanel {

        private BufferedImage bgMaster;
        private BufferedImage bgImage;
        private Timer timer;

        private double delta = 1.0;
        private double backgroundXPos = 0;

        public RenderPane(BufferedImage background) {
            this.bgMaster = background;
            bgImage = new BufferedImage(getPreferredSize().width, getPreferredSize().height, bgMaster.getType());
            renderBackground();
            timer = new Timer(5, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent evt) {
                    backgroundXPos -= delta;
                    if (backgroundXPos + background.getWidth() < 0) {
                        System.out.println("Reset");
                        backgroundXPos = 0;
                    }
                    renderBackground();
                    repaint();
                }
            });
            timer.start();
        }

        protected void renderBackground() {
            Graphics2D g2d = bgImage.createGraphics();
            g2d.drawImage(bgMaster, (int)backgroundXPos, 0, null);

            double overflow = bgMaster.getWidth() - (backgroundXPos * -1) - getWidth();
            if (overflow < 0) {
                double overflowX = getWidth() + overflow;
                g2d.drawImage(bgMaster, (int)overflowX, 0, null);
            }

            g2d.dispose();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            if (bgImage != null) {
                g2d.drawImage(bgImage, 0, 0, this);
            }
            g2d.dispose();
        }

    }

}
0
ответ дан MadProgrammer 18 January 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: