java - 同时移动两个具有不同且不断变化的文本的图形

标签 java loops graphics repaint

我编写的代码给出的输出与所需的有所不同。

输出:

  1. 在向上移动时,黄色矩形从左向右逐步移动。在每个步骤中,其文本变化 1(信号 1、信号 2、信号 3 等)

  2. 在较低的移动中,文本从左向右移动(速度高于上面的黄色矩形)。

  3. 两者(上方和下方)中的文本保持相同,即如果上方是“信号 1”,下方也是“信号 1”,如果上方是“信号 2”,则下方也是相同的“信号 2”。等等。

所需输出:

一切都应该保留,除了: 1. 在下部运动中,我需要绿色矩形中的文本(与上面的黄色矩形相同)。 2. 在较低的运动中,我需要循环中较高的 2 文本。换句话说,

    if above is "Signal 1"  below should be "Signal 3". 
    If above is "Signal 2"  below should be "Signal 4". 
    If above is "Signal 3"  below should be "Signal 5".
    if above is "Signal 4"  below should be "Signal 6". 
    If above is "Signal 5"  below should be "Signal 7". 
    If above is "Signal 6"  below should be "Signal 8".  
    if above is "Signal 7"  below should be "Signal 9".
    if above is "Signal 8"  below should be "Signal 10". 
    If above is "Signal 9"  below should be "Signal 1". 
    If above is "Signal 10" below should be "Signal 2". 

作为编程和 java 新手,我需要帮助才能获得所需的输出。谢谢期待。我完整的工作代码是:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.font.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GraphStepTwo implements Runnable {

    private JFrame frame;

    private VoyageRunnable VoyageRunnable;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new GraphStepTwo());
    }

    @Override
    public void run() {
        frame = new JFrame("Image Move");
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent event) {
                exitProcedure();
            }
        });

        DrawingPanel drawingPanel = new DrawingPanel();
        frame.add(drawingPanel);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

        VoyageRunnable = new VoyageRunnable(drawingPanel, new Voyage());
        new Thread(VoyageRunnable).start();
    }

    public void exitProcedure() {
        VoyageRunnable.setRunning(false);
        frame.dispose();
        System.exit(0);  
    }

    public class DrawingPanel extends JPanel {//////////////////////////////// 
        private int xPos, yPos, width, height, xPos2, yPos2, width2, height2;

        private Step step; 

        public DrawingPanel() {
            this.width = 100;
            this.height = 50;
            this.xPos = 0;
            this.yPos = 50;


            this.width2 = 100;
            this.height2 = 40;
            this.xPos2 = 0;
            this.yPos2 = 150;

            this.setPreferredSize(new Dimension(800, 200));
        }


        public void setStep(Step step) {
            this.step = step;
            this.xPos += 10;
            this.xPos2 += 35;
            repaint();
        }



        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.setColor(Color.WHITE);
            g.fillRect(0, 0, getWidth(), getHeight());

            g.setColor(Color.ORANGE);
            g.fillRect(xPos, yPos, width, height);

            if (step != null) {
                g.setColor(Color.BLACK);
                centerString(g, new Rectangle(xPos, yPos, width, height),
                        step.getSignal(), g.getFont());




                centerString(g, new Rectangle(xPos2 , yPos2 , width2 , height2),
                        step.getSignal(), g.getFont());

            }
        }

        public void centerString(Graphics g, Rectangle r, String s, Font font) {
            FontRenderContext frc = new FontRenderContext(null, true, true);

            Rectangle2D r2D = font.getStringBounds(s, frc);
            int rWidth = (int) Math.round(r2D.getWidth());
            int rHeight = (int) Math.round(r2D.getHeight());
            int rX = (int) Math.round(r2D.getX());
            int rY = (int) Math.round(r2D.getY());

            int a = (r.width / 2) - (rWidth / 2) - rX;
            int b = (r.height / 2) - (rHeight / 2) - rY;

            g.setFont(font);
            g.drawString(s, r.x + a, r.y + b);
        }
    }

    public class VoyageRunnable implements Runnable {

        private boolean running;

        private DrawingPanel drawingPanel;

        private Voyage voyage;

        public VoyageRunnable(DrawingPanel drawingPanel, Voyage voyage) {
            this.drawingPanel = drawingPanel;
            this.voyage = voyage;
            this.running = true;
        }

        @Override
        public void run() {
            while (running) {
                Step step = voyage.getStep();
                setStep(step);
                sleep(step);
            }
        }

        public void setStep(final Step step) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {   
                    drawingPanel.setStep(step); 
                }
            });
        }


        private void sleep(Step step) {
            try {
                Thread.sleep(step.getDelay());
            } catch (InterruptedException e) {

            }
        }

        public void setRunning(boolean running) {
            this.running = running;
        }

    }

    public class Voyage {

        private int index;
        private List<Step> steps;

        public Voyage() {
            this.steps = new ArrayList<>();

            this.steps.add(new Step("Signal 1", 2000L));
            this.steps.add(new Step("Signal 2", 1000L));
            this.steps.add(new Step("Signal 3", 2000L));
            this.steps.add(new Step("Signal 4", 1000L));
            this.steps.add(new Step("Signal 5", 2000L));
            this.steps.add(new Step("Signal 6", 1000L));
            this.steps.add(new Step("Signal 7", 2000L));
            this.steps.add(new Step("Signal 8", 1000L));
            this.steps.add(new Step("Signal 9", 2000L));
            this.steps.add(new Step("Signal 10", 1000L));

            this.index = 0;
        }

        public Step getStep() {
            Step step = steps.get(index);
            index = ++index % steps.size();
            return step;
        }
    }

    public class Step {///////////////////////////////////////////////////
        private final String signal;
        private final long delay;

        public Step(String signal, long delay) {
            this.signal = signal;
            this.delay = delay;
        }

        public String getSignal() {
            return signal;
        }

        public long getDelay() {
            return delay;
        }

    }

}

最佳答案

对我来说看起来像是家庭作业。我不理解这种给学生一堆他们不理解的代码而不是让他们从头开始编写代码的方法。另外,命名尤其是“DrawingPanel”非常糟糕。通过在互联网上阅读来学习编程可能比通过此类类(class) Material 更好。

您应该创建其中两个,而不是向 DrawingPanel 添加 width2 等;每个包含文本的框都有一个。

关于java - 同时移动两个具有不同且不断变化的文本的图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31404395/

相关文章:

java服务器上的javascript fetch cors错误

jquery - 在循环中生成文本和订单号

Java while循环无休止地捕获不匹配异常

java - 如何通过文本在 List<WebElement> 中查找 WebElement?

algorithm - 相交线和点阵?

java - 简单的基于REST的程序中的HTTP 500 Internal Server Error。从服务器接收/发送响应时,在GET和POST中感到困惑

java - 我可以将接口(interface)传递给 Fragment 包吗?

javascript - 用于显示组织结构图的免费 javascript 小部件

java - 如何在java中填充多边形?

java - JTable 单元格中的 JComboBox。选择更改会影响其他行中的 JComboBox