Chiranthaka Sampath Ответов: 3

Передача значений между двумя формами JPanel в Java Swing.


Я создал 3 класса. 1-й класс используется для хранения переменной. другие классы используются для ввода и отображения данных.

1-й класс

public class Student {

    /**
     * @param args the command line arguments
     */
    
    private String strStudNo;
    private String strStudName;
    private int iMaths;
    private int iScience;
    private int iEnglish;

    public String getStrStudNo() {
        return strStudNo;
    }

    public void setStrStudNo(String strStudNo) {
        this.strStudNo = strStudNo;
    }

    public String getStrStudName() {
        return strStudName;
    }

    public void setStrStudName(String strStudName) {
        this.strStudName = strStudName;
    }

    public int getiMaths() {
        return iMaths;
    }

    public void setiMaths(int iMaths) {
        this.iMaths = iMaths;
    }

    public int getiScience() {
        return iScience;
    }

    public void setiScience(int iScience) {
        this.iScience = iScience;
    }

    public int getiEnglish() {
        return iEnglish;
    }

    public void setiEnglish(int iEnglish) {
        this.iEnglish = iEnglish;
    }
    
    public double  calTotal(){
        return (getiMaths()+getiScience()+getiEnglish());   
    }
    
    public double  calAverage(){
        
        return (calTotal()/3);  
    }
    
    public String findGrade(){
        
        String strGrade = new String();
        
        if (calAverage()>70){
            
            strGrade = "A";
            
        }else if(calAverage()>60){
            
            strGrade = "B";
            
        }else if (calAverage()>50){
            
            strGrade = "S";
            
        }else{
            strGrade = "Fail";
        }
        return strGrade;
    }
    
    public static void main(String[] args) {
        // TODO code application logic here
    }
}


2-й класс

Этот класс разработан с использованием объекта Swing JPanel и используется для ввода StudNo, StudName, Marks для 3 предметов. Это также включает в себя 2 кнопки, такие как btnCalculate и btnCancel. Этот пользовательский интерфейс был разработан с использованием Java swing class путем автоматической генерации. Когда btnCalculate щелкает, данные в текстовых полях будут назначены переменным 1-го класса. И там расчеты будут производиться с использованием 3-х методов.

 import javax.swing.JFrame;

/**
 *
 * @author Administrator
 */
@SuppressWarnings("serial")
public class EnterDetails extends javax.swing.JPanel {

    /**
     * Creates new form EnterDetails
     */
    
    public static void main(String[] args) {
        
        JFrame oJFrame = new JFrame();
        oJFrame.getContentPane().add(new EnterDetails());
        oJFrame.setDefaultCloseOperation(oJFrame.EXIT_ON_CLOSE);
        oJFrame.setSize(500, 500);
        oJFrame.setVisible(true);
        
    }
    public EnterDetails() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
                    

    private void btnCalculateActionPerformed(java.awt.event.ActionEvent evt) {                                             
        // TODO add your handling code here:
        
        JPanelOnJFrameMulti oJpanelOnJFrameMulti = new JPanelOnJFrameMulti();
        
        oJpanelOnJFrameMulti.setStrStudNo(txtStudId.getText());
        oJpanelOnJFrameMulti.setStrStudName(txtStudName.getText());
        
        oJpanelOnJFrameMulti.setiMaths(Integer.parseInt(txtMaths.getText()));
        oJpanelOnJFrameMulti.setiScience(Integer.parseInt(txtScience.getText()));
        oJpanelOnJFrameMulti.setiEnglish(Integer.parseInt(txtEnglish.getText()));
        
        oJpanelOnJFrameMulti.calTotal();
        oJpanelOnJFrameMulti.calAverage();
        oJpanelOnJFrameMulti.findGrade(); 
       
        DisplayDetails oDisplayDet = new DisplayDetails();
        
        oDisplayDet.setVisible(true);
        
        
        JFrame oJFDisDet = new JFrame();
       
      
        oJFDisDet.getContentPane().add(new DisplayDetails());
        oJFDisDet.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        oJFDisDet.setSize(500, 500);
        oJFDisDet.setVisible(true);    
        
    }                                            

    // Variables declaration - do not modify                     
    private javax.swing.JButton btnCalculate;
    private javax.swing.JButton btnCancel;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JTextField txtEnglish;
    private javax.swing.JTextField txtMaths;
    private javax.swing.JTextField txtScience;
    private javax.swing.JTextField txtStudId;
    private javax.swing.JTextField txtStudName;
    // End of variables declaration                   
}


3-й класс

Другой пользовательский интерфейс, который используется для просмотра окончательных результатов расчетов, то есть общих оценок, средних оценок и оценки. Когда btnCalculate щелкает, результат должен перейти в 3-й класс, то есть класс DisplayInfo JPanel. Моя проблема заключается в том, что когда я нажимаю кнопку btnCalculate, она действительно вычисляет общие оценки, средние оценки и оценку. 3-й класс, то есть форма DisplayInfo JPanel, также будет отображаться, но данные не прошли, текстовые поля были пусты.

Я не знаю, что я сделал не так? Пожалуйста, кто-нибудь может мне помочь.

Обновление

public class DisplayDetails extends JPanel {

    /**
     * Creates new form DisplayDetails
     */
    
    
    public void load(){
        
      Student oStudent = new Student();
      txtStudId.setText(oStudent.getStrStudName());
      txtStudId.setText(oStudent.getStrStudNo());
      
      txtTotal.setText(Double.toString(oStudent.calTotal()));
      txtAverage.setText(Double.toString(oStudent.calAverage()));
      
      txtGrade.setText(oStudent.findGrade()); 
        
    }
   
    public DisplayDetails() {
        initComponents();
    }
    
   // DisplayDetails.

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          

    }// </editor-fold>                        
    // Variables declaration - do not modify                     
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JTextField txtAverage;
    private javax.swing.JTextField txtGrade;
    private javax.swing.JTextField txtStudId;
    private javax.swing.JTextField txtStudName;
    private javax.swing.JTextField txtTotal;
    // End of variables declaration                   
}


спасибо
Чирантака.

3 Ответов

Рейтинг:
5

TorstenH.

Короткое решение.
Я использовал одного студента и шаблон Observer[^] (*) , что делает его довольно скользким.
Вы можете поиграть с ним и расширить базовую схему.

(*) заметьте, что у Ларса Фогеля есть довольно хорошие учебники.

public class Application extends JFrame{

	private ShowPanel oShowPanel;
	private EnterPanel oEnterPanel;
	
	public Application(){
		super("Example");
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		this.setSize(200, 300);
		this.ignition();
		this.setVisible(true); // makes itself visible
	}

	private void ignition() {
		this.setLayout(new GridLayout(2, 1));

		// create data object
		Student oStudent = new Student();
		// pass Object to JPanels
		oEnterPanel = new EnterPanel(oStudent);
		oShowPanel = new ShowPanel(oStudent);
		
		// Student is observed by ShowPanel
		oStudent.addObserver(oShowPanel);
		
		// add Panels to GUI
		this.add(oEnterPanel, 0);
		this.add(oShowPanel, 1);
	}

	/**
	 * <p>simple JPanel, which owns a text field and a button.<br>
	 * Clicking the button sets the name of the Object Student.</br></p>
	 */
	public class EnterPanel extends JPanel{

		public EnterPanel(Student oStudent){
			super();
			this.ignition(oStudent);
		}

		private void ignition(final Student oStudent) {
			this.setLayout(new GridLayout(3, 1));
			
			this.add(new JLabel("Enter name:"));
			final JTextField oText = new JTextField();
			this.add(oText);
			JButton oButton = new JButton("Click me hard!");
			oButton.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent oEvent) {
					oStudent.setName(oText.getText());
				}
			});
			this.add(oButton);
		}
	}
	
	/**
	 * <p>ShowPanel observes the data Object Student. <br>
	 * When notified, it updates the Label to present the name.</br></p>
	 */
	private class ShowPanel extends JPanel implements Observer {
		
		JLabel oLabel;
		public ShowPanel(Student oStudent){
			this.ignition(oStudent);
		}

		private void ignition(Student oStudent) {
			this.setLayout(new GridLayout(2, 1));
			this.add(new JLabel("Name is:"));
			
			oLabel= new JLabel();
			this.add(oLabel);
		}

		@Override
		public void update(Observable oObservable, Object oObject) {
			// we do not figure who kicked us, we just repaint.
			System.out.println("TEST");
			Student oStudent = ((Student)oObservable); // cast
			this.oLabel.setText(oStudent.getName()); // renew value
		}
	}
	
	/**
	 * <p>data Object, which holds the name of one student.<br>
	 * Classic POJO which extends Observable. The setter notifies the Observers.</br></p>
	 */
	public class Student extends Observable{
		private String strName;
		public Student() { /* doany() */}
		
		public void setName(String strName) {
			this.strName = strName;
			setChanged();
			notifyObservers();
		}

		public String getName() {
			return strName;
		}
	}
	
	// entry point
	public static void main(String[] args) {
		new Application(); // create Object
	}
}


Chiranthaka Sampath

Хорошо, сэр, я решил свою проблему, используя предоставленное вами решение. Но все равно спасибо. Я сделал закладку в учебник от Ларса Вогала, и я действительно ценю Ваше мнение.

Рейтинг:
28

TorstenH.

Не размещайте свои данные в JPanel:

public static void main(String[] args) {

        MyData oData = new MyData();// create data object

        JFrame oJFrame = new JFrame(); 
        oJFrame.getContentPane().add(new EnterDetails(oData));// pass Object to GUI Component as an argument
        oJFrame.setDefaultCloseOperation(oJFrame.EXIT_ON_CLOSE);
        oJFrame.setSize(500, 500);
        oJFrame.setVisible(true);
        
    }


и, пожалуйста, вырви эту основную функцию из JPanel. основная функция принадлежит к отдельному классу:

public class Application{
      public static void main(String[] args) {

        // create data object
        MyData oData = new MyData();

        JFrame oJFrame = new JFrame(); 
        oJFrame.getContentPane().add(new EnterDetails(oData));// pass Object to GUI Component as an argument
        oJFrame.setDefaultCloseOperation(oJFrame.EXIT_ON_CLOSE);
        oJFrame.setSize(500, 500);
        oJFrame.setVisible(true);
        
    }
}


Этот класс "приложение" определяет жизненный цикл вашего приложения.
Компоненты графического интерфейса предназначены только для визуального представления. Вы можете создавать, изменять и уничтожать их, когда вам это нужно.


Chiranthaka Sampath

Хорошо, приятель, тогда что же делает класс MyData? Это похоже на "публичный класс JPanelOnJFrameMulti{}" в моей программе, которая хранит значения?

TorstenH.

Да, пожалуйста, разделите класс и разделите графический интерфейс и данные. Это общий дизайн в приложениях, здесь в легкой версии, иногда (*) в расширенной версии и в больших фреймворках в тяжелой версии.

(*) Разработка приложений Java SE с помощью MVC

Chiranthaka Sampath

Мои графические интерфейсы находятся в отдельных классах, а переменные-в отдельном классе. Я не могу понять, что вы мне говорите, сэр!

Chiranthaka Sampath

Хорошо, сэр, я удалил main() из форм JPanel. Тогда я выполнил 1-й класс и это был успех. Но,как и предыдущие попытки, результаты из 1-го класса, т. е. calTotal (), calAverage() и findGrade() вернут любые ответы, но 2-й GUIs, похоже, не захватывает эти результаты из 1-го класса, т. е. переменные и другие вычисления находятся. Я не могу найти проблему, пожалуйста, помогите мне.

TorstenH.

Вам нужно иметь более одного студента - а затем установить значения для объекта student с помощью методов set.

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

Chiranthaka Sampath

Хорошо, я удалил все ненужные main ( ) из 2 классов JPanel, чтобы избежать путаницы при доступе к классам. Но теперь моя проблема заключается в том, что когда я ввожу значения из 1-й формы JPanel, я хочу, чтобы расчет был выполнен в классе Student { } и извлек эти данные из 2-й формы JPanel. При нажатии на кнопку Рассчитать на Форма для jpanel 1 нажал 2-й формы для jpanel прекрасно загружается. Но данные, которые я передал из класса студента во 2-ю JPanel, не отображаются. Мой исходный код для второй формы JPanel находится в обновленном вопросе.

TorstenH.

выглядит довольно хорошо на коротком обзоре. Я предполагаю, что есть и другие части, которые раскладывают компоненты - не видимые здесь.
Возможно, Вам потребуется обновить графический интерфейс после добавления данных, вызвав метод update() Jpanel.

Chiranthaka Sampath

Я не могу найти никакого метода Update ( ) относительно формы JPanel.

Chiranthaka Sampath

Все, что я хочу, это когда 2-я форма JPanel, то есть DisplayDetails, открывает данные в классе Student, которые будут вставлены в текстовые поля формы DisplayDetails. Я застрял в этой точке. Если вы, пожалуйста, дадите мне какой-нибудь ключ к этому. Потому что Ypu упоминал об обновлении JPanel (), но я не смог его найти. Я не думаю, что это является встроенным. Спасибо!

TorstenH.

вы используете качели! это моя вина, вы должны искать функцию repaint()...извините за это.

Класс JComponent - компоненты рисования

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

Chiranthaka Sampath

Я уже пробовал это, как показано ниже.

общественного недействительными перекрасить() {
super.repaint(); //чтобы изменить тело сгенерированных методов, выберите инструменты | Шаблоны.
}
нагрузки общественная недействительным (){

Студент остудент = новый студент();

txtStudId.setText(oStudent.getStrStudName());
txtStudId.setText(oStudent.getStrStudNo());

txtTotal.помощью setText(двойной.метод toString(oStudent.calTotal()));
txtAverage.помощью setText(двойной.метод toString(oStudent.calAverage()));

txtGrade.помощью setText(oStudent.findGrade());

перекрасить();

}

Результат тот же, и 2-й пользовательский интерфейс не захватил данные.

Я также попробовал следующее

JComponent.перекрасить( );

Это тоже не сработало.

Я не могу найти никакого решения для этого. Пожалуйста, попытайтесь оказать мне дополнительную помощь. Спасибо.

Chiranthaka Sampath

Я решил свою проблему и опубликовал ее в качестве ответа. Если есть другие способы сделать это, пожалуйста, просветите меня. Но все равно спасибо
за советы, которые вы дали. Я действительно ценю это.

Рейтинг:
19

Chiranthaka Sampath

Я решил свою проблему, используя ключевое слово static. Я измененный все переменные в классе учащихся от нестатического к статическому контенту
а еще я изменился все то геттер () и сеттер () от нестатического к статическому контенту.

Тогда доступ к переменным и другим методам осуществляется следующим образом.

private void btnCalculateActionPerformed(java.awt.event.ActionEvent evt) {
       // TODO add your handling code here:

       Student.setStrStudNo(txtStudId.getText());
       Student.setStrStudName(txtStudName.getText());
       Student.setiMaths(Integer.parseInt(txtMaths.getText()));
       Student.setiScience(Integer.parseInt(txtScience.getText()));
       Student.setiEnglish(Integer.parseInt(txtEnglish.getText()));

       Student.calTotal();
       Student.calAverage();
       Student.findGrade();

       DisplayDetails oDisplayDet = new DisplayDetails();

       oDisplayDet.setVisible(true);

       JFrame oJFDisDet = new JFrame();

       oJFDisDet.getContentPane().add(new DisplayDetails());
       oJFDisDet.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       oJFDisDet.setSize(500, 500);
       oJFDisDet.setVisible(true);

   }


   private void load(){

     txtStudId.setText(Student.getStrStudNo());
     txtStudName.setText(Student.getStrStudName());

     txtTotal.setText(Double.toString(Student.calTotal()));
     txtAverage.setText(Double.toString(Student.calAverage()));

     txtGrade.setText(Student.findGrade());

     repaint();

   }

   public DisplayDetails() {
       initComponents();

       this.load();

   }


TorstenH.

Какое - то зло действительно делает это вот так. Возможно, Вам придется кодировать Visual Basic в аду для этого ;)

У вас есть геттер и сеттеры - пока вы передаете объект Student на панель, он должен иметь возможность получить доступ к геттерам и загрузить данные.
Если это сделано после создания панели, панель должна быть обновлена и принудительно выложена заново для отображения данных.

Chiranthaka Sampath

Тогда что же мне делать, сэр ? Поскольку я попробовал это сделать и не смог получить результаты на 2-й JPanel (), то что же мне делать? Пожалуйста, помогите мне.