Java draw.String()和fillRect()使用相同的传递坐标写入JFrame上的不同位置

Java draw.String()和fillRect()使用相同的传递坐标写入JFrame上的不同位置,java,jframe,Java,Jframe,我对Java非常陌生,我正在尝试创建一个条形图,从文本字段中获取5个值,并创建一个包含5个值的条形图。我让它的大部分工作正常,也许不是以最有效的方式,但我在使用drawString()时遇到了麻烦。为了调试,我试图在每个条的顶部输出每个条的高度,因为最终我需要以10步为单位标记整个y轴。但是,每次我将相同的精确y值“height”传递给draw.String(),它都会输出到矩形左上部分以外的其他位置。我不知道为什么会这样。传递相同的y值是否意味着输出将处于相同的高度?任何帮助都将不胜感激。我附

我对Java非常陌生,我正在尝试创建一个条形图,从文本字段中获取5个值,并创建一个包含5个值的条形图。我让它的大部分工作正常,也许不是以最有效的方式,但我在使用drawString()时遇到了麻烦。为了调试,我试图在每个条的顶部输出每个条的高度,因为最终我需要以10步为单位标记整个y轴。但是,每次我将相同的精确y值“height”传递给draw.String(),它都会输出到矩形左上部分以外的其他位置。我不知道为什么会这样。传递相同的y值是否意味着输出将处于相同的高度?任何帮助都将不胜感激。我附上了我得到的输出图片。虽然,我没有包括在这里,我有两行代码来绘制x轴和y轴

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


    double v1 = Double.parseDouble(jTextField1.getText());
    double v2 = Double.parseDouble(jTextField2.getText());
    double v3 = Double.parseDouble(jTextField3.getText());
    double v4 = Double.parseDouble(jTextField4.getText());
    double v5 = Double.parseDouble(jTextField5.getText());

    Graphics pg = jPanel2.getGraphics();

    int[] values = {(int)v1,(int)v2,(int)v3,(int)v4,(int)v5};
    double space = (jPanel2.getHeight()*.09);
    //Space for the bottom
    int spaceY = (int)space;
    int bar;
    double heightPortion;
    int height; 
    double heightCalc;
    double numHeight;
    int numHeight2;

    //5% of the top of the frame is open
   double gap = getHeight()*.05;
   int gapTrunc = (int)gap;

   //Display each value 
    for (int i= 0; i < 5; i++){


    bar = values[i];   

    //Calculate what portion of the max height of a bar each value is   
    heightPortion = 100-bar;
    heightPortion = heightPortion/100;

   //Use 86% of the graph for the bars
    heightCalc = heightPortion *(.86)*jPanel2.getHeight() + gapTrunc;



    height = (int)heightCalc;



    //Debugging
    System.out.println(height);

    //Use different colors for different letters
    if(0<= bar && bar < 20)
        pg.setColor(Color.orange);
    if(20 <= bar && bar < 40)
        pg.setColor(Color.gray);
    if(40 <= bar && bar < 60)
        pg.setColor(Color.yellow);
    if(60 <= bar && bar < 80)
        pg.setColor(Color.blue);
    if(80 <= bar && bar <= 100)
        pg.setColor(Color.red);


    String s = Integer.toString(bar);

    //Draw bar
    pg.fillRect(jPanel2.getWidth()-(jPanel2.getWidth()*(16-
3*i)/20),height,20,jPanel2.getHeight()-height-spaceY);
    //Label bar with value, passing it the same height
    g.drawString(s,jPanel2.getWidth()-(jPanel2.getWidth()*(16-
3*i)/20),height);


    }


}
public void绘制(图形g)
{
超级油漆(g);
double v1=double.parseDouble(jTextField1.getText());
double v2=double.parseDouble(jTextField2.getText());
double v3=double.parseDouble(jTextField3.getText());
double v4=double.parseDouble(jTextField4.getText());
double v5=double.parseDouble(jTextField5.getText());
Graphics pg=jPanel2.getGraphics();
int[]值={(int)v1,(int)v2,(int)v3,(int)v4,(int)v5};
双空格=(jPanel2.getHeight()*.09);
//底部空间
int spaceY=(int)空间;
int-bar;
双高部分;
内部高度;
双高计算器;
双核;
国际numHeight2;
//框架顶部的5%是打开的
双间隙=getHeight()*.05;
int-gapTrunc=(int)间隙;
//显示每个值
对于(int i=0;i<5;i++){
bar=数值[i];
//计算每个值在杆的最大高度中所占的比例
高度部分=100巴;
高度部分=高度部分/100;
//将图形的86%用于条形图
heightCalc=heightpartion*(.86)*jPanel2.getHeight()+gapTrunc;
高度=(int)高度计算;
//调试
系统输出打印LN(高度);
//对不同的字母使用不同的颜色
如果(00),则表示如下(强调):

使用此图形上下文的当前字体和颜色绘制指定字符串给定的文本。最左侧字符的基线位于此图形上下文坐标系中的位置(x,y)

声明如下(我的重点):

填充指定的矩形。矩形的左和右边缘位于x和x+宽度-1。和下边缘位于y和y+高度-1。生成的矩形覆盖的区域宽度为像素宽,高度为像素高。矩形使用图形上下文的当前颜色填充

声明如下(我的重点):

使用此图形上下文的当前字体和颜色绘制指定字符串给定的文本。最左侧字符的基线位于此图形上下文坐标系中的位置(x,y)

声明如下(我的重点):

填充指定的矩形。矩形的左和右边缘位于x和x+宽度-1。和下边缘位于y和y+高度-1。生成的矩形覆盖的区域宽度为像素宽,高度为像素高。矩形使用图形上下文的当前颜色填充


您正在使用两种不同的图形上下文:

public void paint(Graphics g)
{
    Graphics pg = jPanel2.getGraphics();

    pg.fillRect(...);
    g.drawString(s, ...);

使用相同的上下文,
g
,即传递给绘制例程的上下文。

您使用的是两种不同的图形上下文:

public void paint(Graphics g)
{
    Graphics pg = jPanel2.getGraphics();

    pg.fillRect(...);
    g.drawString(s, ...);

使用相同的上下文,
g
,即传递给绘制例程的上下文。

您犯了一系列基本错误,这似乎表明您没有花时间阅读任何可用的材料。开始时,请查看并获取有关自定义绘制应如何进行的详细信息。如果要查看文本,请使用com如果大多数人都这么想的话,我会建议大家看一看关于文本渲染实际工作原理的更多细节,我只想把这一点说出来——但永远不要使用
getGraphics
,这就是自定义绘制的工作原理,它会导致各种问题,正确使用绘制API可以避免这些问题一系列基本的错误似乎表明你没有花时间阅读任何可用的材料。首先看一看,关于定制绘画应该如何完成的更多信息。如果文本比大多数人认为的要复杂一些,我建议你看一看更多的细节关于文本渲染的实际工作原理,我只想说出来——但永远不要使用
getGraphics
,这就是自定义绘制的工作原理,它会导致各种问题,正确使用绘制API可以避免这些问题