передать значение из класса в JFrame - PullRequest
1 голос
/ 07 января 2011

У меня проблема между передачей значения из класса в другой JFrame

Мой код написан в соответствии с моделью MVC. Поэтому у меня 1 класс - контроллер, один jframe - представление, а 1 класс - модель.

У меня есть некоторый дескриптор процесса на контроллере, чтобы получить значение, и я хочу, чтобы это значение было в jframe, но не передавалось конструктором Как я могу передать значение из класса в jframe и когда будет передано значение, jframe будет использовать его для обработки.

Ex:

public class A{
private String str;
           public A(){

          }

           public void handle(){
               ViewFrame v = new ViewFrame();
               v.setVisible(true);
               v.pack().
               v.setSize(330,600);
               str = "Hello World";   //init value here
               v.getString(str);// pass value to jframe here.
           }
}

=======================

public class ViewFrame extends JFrame{
private String str;
      public ViewFrame (){
        System.out.println(str);
      }

     public String getString(String str){
        return  this.str = str;

     }


}

но возвращается null ??

Ответы [ 2 ]

1 голос
/ 07 января 2011

@ Анализ Andreas_D правильный. Вот более полный пример, который может дать некоторое представление.

import javax.swing.JFrame;
import javax.swing.JLabel;

/** @see https://stackoverflow.com/questions/4623020 */
public class A {

    private static String str = "Hello, world!";

    public static void main(String[] args) {
        ViewFrame v = new ViewFrame(str);
        v.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        v.pack();
        v.setLocationRelativeTo(null);
        v.setVisible(true);
        System.out.println("Equals: " + str.equals(v.getString()));
    }
}

class ViewFrame extends JFrame {

    private String str;

    public ViewFrame(String str) {
        this.str = str;
        this.add(new JLabel(str, JLabel.CENTER));
    }

    public String getString() {
        return this.str;
    }
}

Этот связанный пример MVC тоже может стоить посмотреть.

1 голос
/ 07 января 2011

Первое предложение: переименуйте getString(String str) в setString(String str), потому что на самом деле вы передаете строку в фрейм.Если вы хотите получить значение тем же методом: это работает, как и ожидалось:

public String setString(String str) {
  this.str = str;
  return this.str;
}

Но реализовать такой установщик довольно редко.Чистые установщики обычно не возвращают никакого значения.


Конструктор в ViewFrame имеет две проблемы.Первое - вы не вызываете конструктор суперкласса JFrame.Это работает немного случайно, потому что JFrame имеет открытый конструктор по умолчанию.Но в любом случае конструктор подкласса должен всегда вызывать конструктор суперкласса (super() в вашем случае или super("My ViewFrame") для титрованного фрейма).

Тогда выражение System.out.println(str) будет print null, поскольку str не инициализируется в это время. Сначала вызывается конструктор (включает печать значения str, которое изначально null), , затем , вы вызываете метод и «инициализируете» поле str.

Попробуйте изменить конструктор на:

public ViewFrame(String str){
  super();
  this.str = str;
  System.out.println(str);
}

и логику контроллера на

   ViewFrame v = new ViewFrame("Hello World");
   v.setVisible(true);
   // ...

Это может дать ожидаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...