双铸不产生预期价值

时间:2013-12-14 22:42:41

标签: java swing casting double paint

我正在尝试使用一个具有非常小值的double来生成一个更常规的大小。例如,除以1 /(double)会产生类似于14.12848572的东西......然后我将这个双精度转换为int来生成一个数字,我可以用它在JPanel中绘制图像。

我遇到的问题是图像没有画出我期望它绘制的方式。我想这是因为关于铸造双打是如何工作的,我不明白。任何可以告诉我这个过程实际上如何发生变化的人都会非常有帮助。

编辑:
此代码的目的是将货币值转换为图表上条形图的大小。这些条的大小应该随着值的变化而变化,以便它们以最有效的方式利用空间。

...因此

  • 由于货币价值的性质,max绝不会低于430。

  • 我希望图像越大,xscale就越小。如果要绘制的值较少,则xscale较小,然后将条形绘制得更大。

编辑: 下图显示了我的程序当前正在绘制的内容。我想画的是条形图上的一系列条形图。 xscale和相关变量是我现在主要关注的。 1

编辑: SSCCE完成(我认为)!如果您运行此代码,您将看到我不想要的图形。如果将barwidth更改为等于7或某些正常int,您将看到更符合我想要绘制的内容。如果还有其他事情要让事情变得更容易,请告诉我!

编辑:复制/粘贴错误代码,已更正(derp)

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;


  public class castingexample extends JPanel
{   
private static int ypoint;
private static int barheight;
private static Color color;

private static int bars = 10;
private static int xpoint = 0;
private static int barwidth = 7;
private static double xscale = 7;
private static int yscaleplus = 10000;
private static int yscaleneg = 0;

public static void main(String[] args)
{
    JFrame frame = new JFrame();
    frame.add(new castingexample());
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(500,500);
}

public castingexample()
{   
    new Timer(100, new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            resize();
            repaint();
        }
    }).start();
}

public void resize()
{

        xscale = bars/(800 - bars*5);
        xscale = 1/xscale;
}


public void paintComponent (Graphics g)
{
    super.paintComponent(g);

    for (int i = 0; i < bars; i++)
    {
        barheight = 200;
        barwidth = (int) (xscale);
        ypoint = 450 - barheight;
        xpoint = 105+(barwidth + 5)*i;

        if(ypoint < 450)
            color = Color.green;
        else
            color = Color.red;

        g.setColor(color);
        g.fillRect(xpoint, ypoint, barwidth, barheight);
    }
}

}

以下是一些相关代码:

    public void resize()
{
    int max = 0;
    int min = 0;

        for (int i = 0; i < bars; i++)
        {
            if (getTime(i) > max)
                max = (int)getTime(i);
        }
        yscaleplus = max/430;

        /*
        for (int i = (int)(getLife() - getRetire() + 1); i < bars; i++)
        {
            if (getTime(i) < min)
                min = (int)getTime(i);
        }
        yscaleneg = Math.abs(min/200);
        */

        xscale = bars/(800 - bars*5);
        xscale = 1/xscale;
}


public void paintComponent (Graphics g)
{
    super.paintComponent(g);

    g.drawLine(100, 20, 100, 630);
    g.drawLine(100, 450, 900, 450);

    for (int i = 0; i < bars; i++)
    {
        barheight = (int) (getTime(i)/yscaleplus);
        barwidth = (int) (xscale);
        ypoint = 450 - barheight;
        xpoint = 105+(barwidth + 5)*i;

        if(ypoint < 450)
            color = Color.green;
        else
            color = Color.red;

        g.setColor(color);
        g.fillRect(xpoint, ypoint, barwidth, barheight);
    }
}

1 个答案:

答案 0 :(得分:2)

双打不会像您想象的那样存储信息,它们将信息存储为值,后跟指数值2 ^ x,这会删除您尝试使用的功能

请改为Math.round(x)