Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JLabel.setBounds();正在java代码中生成不令人满意的结果_Java - Fatal编程技术网

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

JLabel.setBounds();正在java代码中生成不令人满意的结果,java,Java,这是我java代码的一部分,在这段代码中,我基本上想从左向右移动一个横幅,直到横幅完全退出JFrame,因此我在循环的每次迭代中通过“move”(“move”在代码中是可变的)来增加横幅的水平位置。问题是,(frame.getWidth()+200)/360返回的值是double类型,但是setBounds();方法无法接收双类型参数,因此我将int-type转换为“move”,结果循环在横幅完全退出JFrame之前终止。这个问题可以通过将循环条件设置为i=frame.getWidth()+20

这是我java代码的一部分,在这段代码中,我基本上想从左向右移动一个横幅,直到横幅完全退出JFrame,因此我在循环的每次迭代中通过“move”(“move”在代码中是可变的)来增加横幅的水平位置。问题是,(frame.getWidth()+200)/360返回的值是double类型,但是setBounds();方法无法接收双类型参数,因此我将int-type转换为“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);   
        }
    }

}
导入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),您希望您的横幅位于右侧吗?