Java 方法计算在JTable中使用时出错,但在控制台中打印时正确

Java 方法计算在JTable中使用时出错,但在控制台中打印时正确,java,swing,jtable,Java,Swing,Jtable,我编写了一个三角形程序,作为JAVA入门课程的作业。一切似乎都很好,除了a)我的一些数字在表中显示为正方形,b)我在表中调用的getperiment()方法产生的结果与在System.out.println中调用的方法不一样语句。也许这两个问题来自同一个问题,我不确定。 以下是我相信来自我的Triangle.java的相关代码: public String getAngleA() { double a = sideA; double b = sideB; double c

我编写了一个三角形程序,作为JAVA入门课程的作业。一切似乎都很好,除了a)我的一些数字在表中显示为正方形,b)我在表中调用的
getperiment()
方法产生的结果与在
System.out.println中调用的方法不一样语句。也许这两个问题来自同一个问题,我不确定。
以下是我相信来自我的Triangle.java的相关代码:

public String getAngleA()
{
    double a = sideA;
    double b = sideB;
    double c = sideC;
    angleA = Math.toDegrees(Math.acos((c*c + b*b - a*a) / (2 * b * c)));
    return df.format(angleA);
}

public String getAngleB()
{
    double a = sideA;
    double b = sideB;
    double c = sideC;
    angleB = Math.toDegrees(Math.acos((a*a + c*c - b*b) / (2 * a* c)));
    return df.format(angleB);
}

public String getAngleC()
{
    angleC = 180 - (angleA + angleB);
    return df.format(angleC);
}

public String getPerimeter()
{
    perimeter = sideA + sideB + sideC;
    return df.format(perimeter);
}
下面是我的TriangleTester.java中的所有代码,因为我不知道问题出在哪里:

        Scanner in = new Scanner(System.in);

    System.out.println("Enter X coordinate for the first corner of the triangle: ");
    int x1 = in.nextInt();
    System.out.println("Enter Y coordinate for the first corner of the triangle: ");
    int y1 = in.nextInt();
    System.out.println("Enter X coordinate for the second corner of the triangle: ");
    int x2 = in.nextInt();
    System.out.println("Enter Y coordinate for the second corner of the triangle: ");
    int y2 = in.nextInt();
    System.out.println("Enter X coordinate for the third corner of the triangle: ");
    int x3 = in.nextInt();
    System.out.println("Enter Y coordinate for the third corner of the triangle: ");
    int y3 = in.nextInt();

    Triangle myTri = new Triangle(x1, y1, x2, y2, x3, y3);
    JFrame frame = new JFrame();

    String[] columnName = {"SIDES", "ANGLES", "PERIMETER", "AREA"};
    Object[][] data = {
            {"The length your triangle on side A is: " + myTri.getSideA(),
             "Angle A = " + myTri.getAngleA() + "\u00b0",
             "The perimeter of your triangle is: " + myTri.getPerimeter(),
             "The area of your triangle is: " + myTri.getArea()},
            {"The length your triangle on side B is: " + myTri.getSideB(),
             "Angle B = " + myTri.getAngleB() + "\u00b0",
             " ", " "},
            {"The length your triangle on side C is: " + myTri.getSideC(),
             " Angle C = " + myTri.getAngleC() + "\u00b0",
             " ", " "},
        };

    JTable table = new JTable(data, columnName);
    DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
    centerRenderer.setHorizontalAlignment( JLabel.LEFT );
    table.getColumnModel().getColumn(1).setCellRenderer(centerRenderer);
    centerRenderer.setHorizontalAlignment( JLabel.CENTER );
    table.getColumnModel().getColumn(2).setCellRenderer(centerRenderer);
    table.getColumnModel().getColumn(3).setCellRenderer(centerRenderer);

    frame.setSize(950,107);
    frame.setVisible(true);
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setTitle("Your Triangle");
    frame.add(table.getTableHeader(),BorderLayout.PAGE_START);
    frame.add(table);

    System.out.println(myTri.getP1() + "\n" +  myTri.getP2() + "\n" + myTri.getP3() + "\n");

    System.out.println("The length of triangle on side A is: " + myTri.getSideA());
    System.out.println("The length of triangle on side B is: " + myTri.getSideB());
    System.out.println("The length of triangle on side C is: " + myTri.getSideC() + "\n");

    System.out.println("Angle A is: " + myTri.getAngleA() + "\u00b0");
    System.out.println("Angle B is: " + myTri.getAngleB() + "\u00b0");
    System.out.println("Angle C is: " + myTri.getAngleC() + "\u00b0" + "\n");

    System.out.println("Perimeter is: " + myTri.getPerimeter() +"\n");

    System.out.println("Area is: " + myTri.getArea());
}
}

最后,这是一张图片,显示了表格的方块和错误的周长输出,在下面,你可以看到控制台打印出正确的数字,所以我知道我的方法是正确的。

我的问题是在运行
getSides()
方法之前,在我的表中调用了
getAngle()
方法,因此
getAngle()
方法没有要使用的值。在我的命令行中,all可以打印出来,因为所有的方法都是按“顺序”运行的,所以
getSides()
方法在我调用第一个
getAngle()
方法之前都已经运行过了。以下是固定的相关代码:

    double sideA = myTri.getSideA();
    double sideB = myTri.getSideB();
    double sideC = myTri.getSideC();
    double angleA = myTri.getAngleA();
    double angleB = myTri.getAngleB();
    double angleC = myTri.getAngleC();
    double perim = myTri.getPerimeter();
    double area = myTri.getArea();

    String[] columnName = {"SIDES", "ANGLES", "PERIMETER", "AREA"};
    Object[][] data = {
            {"Side A = " + df.format(sideA),
             "Angle A = " + df.format(angleA) + "\u00b0",
             "Perimeter = " + df.format(perim),
             "Area = " + df.format(area)},
            {"Side B = " + df.format(sideB),
             "Angle B = " + df.format(angleB) + "\u00b0",
             " ", " "},
            {"Side C = " + df.format(sideC),
             "Angle C = " + df.format(angleC) + "\u00b0",
             " ", " "}
        };

我将命令行输出与GUI输出混合使用的原因是,我的GUI输出无法工作,我需要一种方法来判断我的数字是否正确计算。显然,我不会提交或发布以这种方式运行的程序。

事实上,这表明您的问题将减少混淆并获得更好的响应。您的表格模型应该包含数字数据,而不是描述性字符串。如果需要,渲染器将提供字符串。不要使用其他方法依赖结果时计算的值,例如,
getAngleC
依赖于
getAngleA
getAngleB
中的计算,但它无法知道这些方法是否已被调用。这些方法应该返回
double
,格式化结果是没有责任的……而且不要将命令行和GUI混合使用,这很烦人。。。