2013-06-02 3 views
1

Допустим, у меня есть:получить значения от локальных переменных класса переменных

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 к x и m2 к y?

Потому что я хочу использовать значения m1 и m2 в другом классе? в другом классе, где у меня есть метод рисования, и я хотел бы использовать их в качестве координат для рисования.

Благодаря

моя кнопка действия будет разбирать XML-файл. чем мне нужно четыре переменных для метода рисования, который находится в другом классе

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

Реализовать добытчиками и сеттеров. – Maroun

+0

@HovercraftFullOfEels я редактировал мой вопрос и добавил дополнительную информацию – DRastislav

ответ

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 можно просто вызвать метод getter, когда ему нужно получить текущую копию p1 и p2. Наличие правильной ссылки является ключевым, поскольку вы не можете повторно создать другой экземпляр SomeClass и ожидать, что его поля будут содержать значения другого экземпляра SomeClass, который используется вашей программой.

Более сложная часть приходит, если вы хотите, чтобы информация i была управляемой событиями, если вы хотите, чтобы точки p1 и p2 появились после произошедшего actionPerformed. Если это так, я бы использовал экземпляр PropertyChangeSupport, чтобы позволить слушателям получать уведомления об изменении этих полей. Например, просмотрите this answer, чтобы узнать, как это можно сделать.

+0

Это работает ..... спасибо Sir – DRastislav

+0

@DRastislav: добро пожаловать. –

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(); 
     } 
    }); 
} 
Смежные вопросы