JLabel.setBounds();正在java代码中生成不令人满意的结果
这是我java代码的一部分,在这段代码中,我基本上想从左向右移动一个横幅,直到横幅完全退出JFrame,因此我在循环的每次迭代中通过“move”(“move”在代码中是可变的)来增加横幅的水平位置。问题是,(frame.getWidth()+200)/360返回的值是double类型,但是setBounds();方法无法接收双类型参数,因此我将int-type转换为“move”,结果循环在横幅完全退出JFrame之前终止。这个问题可以通过将循环条件设置为i=frame.getWidth()+200;但我必须运行循环360次。所以请帮忙JLabel.setBounds();正在java代码中生成不令人满意的结果,java,Java,这是我java代码的一部分,在这段代码中,我基本上想从左向右移动一个横幅,直到横幅完全退出JFrame,因此我在循环的每次迭代中通过“move”(“move”在代码中是可变的)来增加横幅的水平位置。问题是,(frame.getWidth()+200)/360返回的值是double类型,但是setBounds();方法无法接收双类型参数,因此我将int-type转换为“move”,结果循环在横幅完全退出JFrame之前终止。这个问题可以通过将循环条件设置为i=frame.getWidth()+20
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);
}
}
}
导入java.awt.Color;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
公共A类{
公共静态void main(字符串arg[])引发异常{
新A();
}
public()引发异常{
JFrame=新JFrame();
JLabel banner=新的JLabel();
setExtendedState(JFrame.MAXIMIZED_二者);
框架。设置未装饰(真实);
frame.getContentPane().setBackground(颜色:黑色);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(空);
banner.set不透明(true);
旗帜.立根(-200,20200,20);
框架。添加(横幅);
frame.setVisible(true);
双移动=(frame.getWidth()+200)/360;
对于(int i=1;i
(frame.getWidth()+200)/360返回的值是双精度类型
否,返回一个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.awt.Color;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
公共A类{
公共静态void main(字符串arg[])引发异常{
新A();
}
public()引发异常{
JFrame=新JFrame();
JLabel banner=新的JLabel();
setExtendedState(JFrame.MAXIMIZED_二者);
框架。设置未装饰(真实);
frame.getContentPane().setBackground(颜色:黑色);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(空);
banner.set不透明(true);
旗帜.立根(-200,20200,20);
框架。添加(横幅);
frame.setVisible(true);
double start=banner.getX();//开始位置
双移动=(frame.getWidth()+200)/360d;//d表示双文本
对于(inti=1;iso),您希望您的横幅位于右侧吗?