整个面板无法访问变量

时间:2016-04-13 21:59:13

标签: java swing scope paintcomponent

我想从表单中获取[setpoints]函数中的两个参数[a,b],并在p​​aintcomponent中使用它们来绘制。问题是整个面板无法访问两个变量。它们只能通过[设定点]功能

以下是小组的代码:

public class shape extends javax.swing.JPanel  {

public int a;
public int b;

public shape() {
    initComponents();

 } 
 public void setpoints(int x0,int y0)
 {
     this.a=x0;
    this.b=y0;

 }

 @Override
 protected void paintComponent(Graphics g) {
    super.paintComponent(g);

   g.setColor(Color.blue); 
    g.drawLine(a, b, a,b);

 }
 }

公共类NewJFrame扩展了javax.swing.JFrame {

public NewJFrame() {
    initComponents();

}
 public float p1;
public float p2;
public float p3;
public float p4;

 public void drawline1(){
     int k = 0;
     float x = p1;
     float y = p2;
    float DX = p3 - p1;
    float DY = p4 - p2;
    float m=DY/DX;
    int rx,ry;

    table.getColumnModel().getColumn(1).setHeaderValue("Round(X)");
    table.getColumnModel().getColumn(2).setHeaderValue("Round(Y)");
    table.getTableHeader().repaint(); 
    DefaultTableModel model = (DefaultTableModel) table.getModel();
    model.setRowCount(0);
    model.addRow(new Object[]{k, x, y, x, y});
    shape s=new shape();
   s.setpoints((int)x, (int)y);

    do{
        if(DX>DY){
            k++;
            x++;
            y=y+m;
            rx=Math.round(x);
            ry=Math.round(y);
            model.addRow(new Object[]{k, rx, ry, x, y}); 
           s.setpoints(rx, ry);
        }
        if(DY>DX){
            k++;
            y++;
            x=x+(1/m);
            rx=Math.round(x);
            ry=Math.round(y);
            model.addRow(new Object[]{k, rx, ry, x, y}); 
          s.setpoints(rx, ry);
        }

    }
    while(y < p4 && x < p3); 
     }

1 个答案:

答案 0 :(得分:1)

您的问题似乎位于此处:

public void drawline1() {
    int k = 0;
    float x = p1;
    // ..... etc

    shape s = new shape(); // ******  HERE ******

您正在drawline1方法中创建一个新的形状对象,并通过更改其内部字段所持有的值来更改其状态,但此形状对象似乎不会显示在GUI中的任何位置,因此制作更改其状态可能不会影响GUI中显示的任何形状对象。

解决方案是 NOT 在此方法中创建新的形状对象,而是获取对当前在GUI中显示的形状对象的引用,然后如果显示形状对象,则对状态字段进行更改。

如何执行此关键过程是我们无法回答的问题,因为我们不知道您在何处或如何显示可视化形状对象或当前哪些变量引用此显示的形状对象。因此,您的工作是找出这些变量,然后将它们的值传递给包含此drawline1()方法的类,从而允许该方法改变所显示的形状对象的状态。

其他建议:

  • 学习并遵循Java命名约定,例如,所有类名都应以大写字母开头,因此public class Shape不是public class shape。这很重要,因为它会让其他人(我们!您的老师)更容易理解您的代码。
  • 了解视图/逻辑分离,包括M-V-C,它代表模型 - 视图 - 控制器。如果您可以重新考虑代码以使逻辑代码在其自己的类中,则调试和修复这些类型的错误变得更加容易。