【发布时间】:2021-07-19 19:37:15
【问题描述】:
我有一个矩形,我试图让它像某种图形一样增长,但它并没有显示它实时增长,它只有一个白屏,然后我看到一个矩形。任何帮助将不胜感激,谢谢。我遇到问题的代码位于“动画栏”注释下。
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Main extends JPanel {
static String[] mainArr;
static int start;
static boolean done = false;
static double datapoint1;
static double datapoint2;
static int jPlaceholder;
public static void main(String[] args) throws Exception {
// Creating the window
JFrame panel = new JFrame();
panel.setSize(450,250);
// Creating the window that shows the animation
JFrame drawingFrame = new JFrame();
drawingFrame.setSize(450,250);
JPanel jp = new JPanel();
jp.setLayout(null);
jp.setBackground(Color.red);
drawingFrame.add(jp);
// Creating all the text fields
JTextField dataTypesTextField = new JTextField("This box is currently not in use. Please do not type anything into this box");
dataTypesTextField.setBounds(50,50, 400,30);
panel.add(dataTypesTextField);
JTextField yearStartTextField = new JTextField("Type in this box what year your data starts in:");
yearStartTextField.setBounds(50,100, 400,30);
panel.add(yearStartTextField);
JTextField yearEndTextField = new JTextField("Type in this box what year your data ends in:");
yearEndTextField.setBounds(50,150, 400,30);
panel.add(yearEndTextField);
// Creating the button to submit the data
JButton enterButton = new JButton("Enter");
enterButton.setBounds(50,200, 100, 30);
panel.add(enterButton);
// =================================== ActionListener for enter button ========================================
enterButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (done==false) {
// Creating the variables to store the data the user just inputted
start = Integer.parseInt(yearStartTextField.getText());
int end = Integer.parseInt(yearEndTextField.getText());
mainArr = new String[end-start+1];
// Gets the data points
dataTypesTextField.setText("Datapoints you will use in order, space between each: ");
done = true;
} else {
// Getting all the data needed
mainArr = dataTypesTextField.getText().split(" ");
double[] datapoints = new double[mainArr.length];
for (int i=0; i<datapoints.length; i++) {
datapoints[i] = Double.parseDouble(mainArr[i]);
}
我很确定这里是我遇到问题的地方,但我本可以在其他地方搞砸。
// Animates the bar
for (int i=0; i<datapoints.length-1; i++) {
// Getting all the datapoints
datapoint1 = datapoints[i];
datapoint2 = datapoints[i+1];
int j = 0;
while(j<50) {
j++;
int width = (int) (datapoint1+((datapoint2-datapoint1)/50)*j);
JPanel rectangle = new JPanel();
rectangle.setBackground(Color.black);
rectangle.setBounds(50, 50, width, 30);
jp.add(rectangle);
drawingFrame.setVisible(true);
rectangle.repaint();
System.out.println("The width is: "+width);
起初我以为是因为每个“帧”之间没有停顿,但它仍然只是显示一个白屏,然后它显示了矩形。
try {
Thread.sleep(20);
} catch (Exception exp) {
}
}
}
}
}
});
// =====================================================================================================
// Finishes up both the windows
panel.setLayout(null);
panel.setVisible(true);
}
}
【问题讨论】:
-
如果您显示的代码是完整的,至少是带有“动画栏”注释的循环,那么您正在事件调度线程上执行此操作(您绝对应该read up on it) .将循环放入 SwingWorker(即单独的线程),如果其余代码正确(未检查),它应该可以工作。对于 SwingWorker,请查看 How do I use SwingWorker in Java?
-
您的代码结构不正确。 main() 方法只能用于创建框架并向框架添加组件。您不应该使用静态变量。您不应该扩展 JPanel,除非您实际添加了该类的逻辑。查看:stackoverflow.com/a/33907282/131872 和 stackoverflow.com/a/54028681/131872 和 stackoverflow.com/q/64196198/131872 了解使用动画的不同示例。
标签: java