2016-10-15 52 views
0

我想写什么应该是一个非常简单的项目在Java中。我正在尝试创建2个类,其中主类在类2中执行一个方法来创建一个新的JFrame对象。然后,主类通过类2中的方法来设置2个变量的值。然后,应在JFrame面板上以设置的x和y值打印一个字符串。但是,它好像xPos和yPos没有更改,并且字符串打印在0,0。从java中的另一个类访问变量

这是代码:

import java.awt.*; 
import javax.swing.*; 

public class Test { 
     public static void main(String[] args){ 
       Class2 obj = new Class2(); 
       obj.createJFrame(); 
       obj.setVal(100, 200); 
     } 
} 

class Class2 extends JPanel{ 
     private int xPos, yPos; 
     public void createJFrame(){ 
       JFrame window = new JFrame(); 
       Class2 obj2 = new Class2(); 
       window.setVisible(true); 
       window.setSize(300, 300); 
       window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       Container c = window.getContentPane(); 
       c.add(obj2); 
     } 
     public void setVal(int x, int y){ 
       xPos = x; 
       yPos = y; 
       repaint(); 
     } 
     public void paintComponent(Graphics g){ 
       super.paintComponent(g); 
       g.drawString("This string should be at 100, 200", xPos, yPos); 
     } 
} 

作为一个方面说明,我不认为我的标题是准确的,那么这将是巨大的,如果有人可以帮助我编辑的标题。如果标题不符合问题,我很抱歉,但我是java新手。而且,这个程序正在模拟一个更复杂的程序,所以如果这个方法看起来效率很低,那是因为更复杂的程序会使用这样的结构。先谢谢你。

回答

2
class Class2 extends JPanel{ 
     private int xPos, yPos; 
     public void createJFrame(){ 
       JFrame window = new JFrame(); 
       // Class2 obj2 = new Class2(); 
       window.setVisible(true); 
       window.setSize(300, 300); 
       window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       Container c = window.getContentPane(); 
       c.add(this); // now the setValue will update the object 
     } 
... 

您没有更新添加到JFrame中的对象。另外,我会在静态方法或不同类中创建JFrame,并将Class2作为参数。例如:

class Class2 extends JPanel{ 
    private int xPos, yPos; 
    public static void createJFrame(Class2 obj){ 
      JFrame window = new JFrame(); 
      window.setVisible(true); 
      window.setSize(300, 300); 
      window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      Container c = window.getContentPane(); 
      c.add(obj); 
    } 
    public void setVal(int x, int y){ 
      xPos = x; 
      yPos = y; 
      repaint(); 
    } 
    public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      g.drawString("This string should be at 100, 200", xPos, yPos); 
    } 
} 

public class Test { 
    public static void main(String[] args){ 
     Class2 obj = new Class2(); 
     obj.setVal(100, 200); 
     Class2.createJFrame(obj); 
    } 
} 
+0

谢谢你,这个作品。我还没有学会使用对象作为参数,但第一个仍然正常工作。我确信一旦我了解了第二种方法,它就会变得有意义,并且会变得更好。但现在,第一种方法运行良好。 – SAT

+0

参见[*初始线程*](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod

相关问题