gpt4 book ai didi

java - JLabel.setBounds();在 java 代码中产生不令人满意的结果

转载 作者:行者123 更新时间:2023-12-02 05:33:05 25 4
gpt4 key购买 nike

这是我的java代码的一部分,在这段代码中我基本上想从左向右移动横幅,直到横幅完全从JFrame中退出,因此我通过“移动”增加横幅的水平位置(“移动”在代码中是变量)在循环的每次迭代中。问题是(frame.getWidth()+200)/360返回的值是double类型但是setBounds();方法无法接收 double 类型参数,因此我将 int 类型转换为“move”,结果是循环在横幅完全从 JFrame 退出之前终止。通过设置循环条件为i!=frame.getWidth()+200;即可解决该问题但我必须循环运行 360 次。所以请帮忙。

import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class A {


public static void main(String arg[]) throws Exception {
new A();
}

public A() throws Exception {

JFrame frame = new JFrame();
JLabel banner = new JLabel();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
frame.getContentPane().setBackground(Color.BLACK);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
banner.setOpaque(true);
banner.setBounds(-200,20,200,20);
frame.add(banner);
frame.setVisible(true);
double move = (frame.getWidth()+200)/360;

for(int i=1; i<=360; i++) {
banner.setLocation(banner.getX()+(int)move,20);
frame.getContentPane().revalidate();
frame.getContentPane().repaint();
Thread.sleep(25);
}
}

}

最佳答案

the value returned by (frame.getWidth()+200)/360 is of double type

不,getWidth()返回一个int,因此整个表达式返回的值也是int类型。在隐式转换为 double 之前,您已经丢失了小数位。

您不应(重新)使用渲染的位置进行计算。舍入误差将以这种方式累积。相反,您应该进行高精度计算,并仅在渲染时舍入为 int

您的代码进行了一些小的更改,以便它可以按预期工作:

import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class A {


public static void main(String arg[]) throws Exception {
new A();
}

public A() throws Exception {

JFrame frame = new JFrame();
JLabel banner = new JLabel();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
frame.getContentPane().setBackground(Color.BLACK);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
banner.setOpaque(true);
banner.setBounds(-200,20,200,20);
frame.add(banner);
frame.setVisible(true);
double start = banner.getX(); // start position
double move = (frame.getWidth()+200)/360d; // d for double literal

for(int i=1; i<=360; i++) {
double x = start+(i*move); // calculate new position in double
banner.setLocation((int) Math.round(x),20); // render in int
frame.getContentPane().revalidate();
frame.getContentPane().repaint();
Thread.sleep(25);
}
}

}

关于java - JLabel.setBounds();在 java 代码中产生不令人满意的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25335315/

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