我正在尝试使用一个具有非常小值的double来生成一个更常规的大小。例如,除以1 /(double)会产生类似于14.12848572的东西......然后我将这个双精度转换为int来生成一个数字,我可以用它在JPanel中绘制图像。
我遇到的问题是图像没有画出我期望它绘制的方式。我想这是因为关于铸造双打是如何工作的,我不明白。任何可以告诉我这个过程实际上如何发生变化的人都会非常有帮助。
编辑:
此代码的目的是将货币值转换为图表上条形图的大小。这些条的大小应该随着值的变化而变化,以便它们以最有效的方式利用空间。
...因此
由于货币价值的性质,max绝不会低于430。
我希望图像越大,xscale就越小。如果要绘制的值较少,则xscale较小,然后将条形绘制得更大。
编辑: 下图显示了我的程序当前正在绘制的内容。我想画的是条形图上的一系列条形图。 xscale和相关变量是我现在主要关注的。
编辑: 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);
}
}
答案 0 :(得分:2)
双打不会像您想象的那样存储信息,它们将信息存储为值,后跟指数值2 ^ x,这会删除您尝试使用的功能
请改为Math.round(x)
。