从局部变量获取值到类变量

时间:2013-06-02 20:22:55

标签: java swing

让我说我有:

class BlaBla{
int x;
int y; 

public void actionPerformed(ActionEvent e){

int m1;
int m2;
// algorhythm where i get values for m1 and m2
}
}

如何将m1的值xm2分配给y

因为我想在另一个类中使用m1m2的值?在另一个我有绘画方法的课程中,我想用它们作为绘画的坐标。

由于

我的操作按钮将解析XML文件。我需要四个变量用于paint方法,这是另一个类

public void actionPerformed(ActionEvent e){
        try{


        JFileChooser fch = new JFileChooser();
        int i = fch.showOpenDialog(null);
        if(i==JFileChooser.APPROVE_OPTION){
            File f = fch.getSelectedFile();

            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(f);
            doc.getDocumentElement().normalize();
            NodeList nList = doc.getElementsByTagName("line");

            // NodeList nList = doc.getElementsByTagName("point");

            for (int temp = 0; temp < nList.getLength(); temp++) {

                Node nNode = nList.item(temp);

                if (nNode.getNodeType() == Node.ELEMENT_NODE) {




                    Element eElement = (Element) nNode;


                    Element line = (Element) nList.item(0);

                    Element point1 = (Element) line.getElementsByTagName("point").item(0);
                    Element point2 = (Element) line.getElementsByTagName("point").item(1);

                     int m1 = Integer.parseInt(point1.getElementsByTagName("X").item(0).getTextContent());
                     int n1 = Integer.parseInt(point1.getElementsByTagName("Y").item(0).getTextContent());
                     int m2 = Integer.parseInt(point2.getElementsByTagName("X").item(0).getTextContent());
                     int n2 = Integer.parseInt(point2.getElementsByTagName("Y").item(0).getTextContent());

我的主要课程是:

public class Line {
public static void main(String[] args){
        JFrame frame = new JFrame();
frame.setSize(500, 500);
frame.setTitle("Test");
    frame.setLayout(new FlowLayout());
final JPanel pnl = new JPanel(){
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            Vyber v = new Vyber();
            g.drawLine(x1, y1, x2, y2); //values from method from another class
            }

2 个答案:

答案 0 :(得分:2)

为了从一个类获取信息到另一个类,我会避免使用局部变量而是设置类字段,如下所示:

public class SomeClass {
  Point p1;
  Point p2;

  public void actionPerformed(ActionEvent e) {

    // some code....

    int m1 = Integer.parseInt(point1.getElementsByTagName("X").item(0).getTextContent());
    int n1 = Integer.parseInt(point1.getElementsByTagName("Y").item(0).getTextContent());
    int m2 = Integer.parseInt(point2.getElementsByTagName("X").item(0).getTextContent());
    int n2 = Integer.parseInt(point2.getElementsByTagName("Y").item(0).getTextContent());

    p1 = new Point(m1, n1);
    p2 = new Point(m2, n2);
  }

  public Point getP1() {
    return p1;
  }

  public Point getP2() {
    return p2;
  }

}

然后,对于正确的SomeClass实例,任何具有 有效引用 的类都可以在需要获取p1和p2的当前副本时调用getter方法。拥有有效的引用是关键,因为您无法重新创建另一个SomeClass实例,并期望其字段将保存程序正在使用的另一个SomeClass实例的值。

如果你想在事件发生后获得p1和p2点,那么如果你想以事件驱动的方式获取信息,就会出现更棘手的部分。如果是这样,我将使用PropertyChangeSupport实例来允许在更改这些字段时通知侦听器。例如,请查看this answer以了解如何做到这一点。

答案 1 :(得分:0)

您需要一个类的实例,我将使用已存在的Point类来说明。

假设我有一个JTextField,我想为其添加一个ActionListener,这样就可以了:

private void addListener(final JTextField textField, final Point point) {
    textField.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            final double m1 = point.getX();
            final double m2 = point.getY();
        }
    });
}

您将遇到的问题是,在此示例中,Point必须为final,因为您无法在匿名内部类中引用非final方法参数。

您也可以将您的类声明为类变量,类似这样

//somewhere in your class
private Point point;

//somewhere else in your class
private void addListener(final JTextField textField) {
    textField.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            final double m1 = point.getX();
            final double m2 = point.getY();
        }
    });
}