gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:39:01 25 4
gpt4 key购买 nike

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

输出:

  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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com