使用不同和更改文本同时移动两个图形

时间:2015-07-14 10:44:30

标签: java loops graphics repaint

我写的代码提供的输出与所需的输出略有不同。

OUTPUT GOT:

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

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

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

  4. 需要输出:

    每件事都应该保留,除非: 1.在较低的移动中,我需要绿色矩形的文本(与上面的黄色矩形相同)。 在较低的运动中,我需要循环中高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;
            }
    
        }
    
    }
    

1 个答案:

答案 0 :(得分:0)

看起来像我的作业。我不明白这种方法可以为学生提供一堆他们不了解的代码,而不是从头开始编写代码。另外,特别命名&#34; DrawingPanel&#34;非常糟糕。你可能最好通过互联网阅读来学习编程,而不是像那样的课程材料。

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