2014-09-07 4 views
0

Меня зовут Gab.Не удается получить доступ к данным из другого класса

Я делаю программу, которая запустит одну страницу для другого, нажав кнопку. Дело в том, что я не могу передать соответствующие данные из двух моих классов. Это может звучит странно, как это, но вот мой код:

Мой первый класс (class1):

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

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

     JPanel panel = new JPanel(); 
     JFrame frame = new JFrame(); 

     GridBagLayout gridBag = new GridBagLayout(); 
     GridBagConstraints c = new GridBagConstraints(); 
     contenu.setLayout(gridBag); 
     boolean start = false; 

     JLabel label1 = new JLabel(
       "<html><p><span style = 'font-size: 18px; font-color: blue'>The Number's Genius </span>(version 1.4)</p></html>"); 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridx = 0; 
     c.gridy = 0; 
     c.gridheight = 1; 
     c.gridwidth = 4; 
     c.ipadx = 500; 
     panel.add(label1, c); 

     JLabel xxx = new JLabel(""); 
     c.gridx = 0; 
     c.gridy = 4; 
     c.gridwidth = 3; 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.ipadx = 550; 
     panel.add(xxx, c); 

     JButton start = new JButton("<html><p><b>Start</b></p></html>"); 
     c.gridx = 3; 
     c.gridy = 4; 
     c.gridwidth = 1; 
     c.ipadx = 1; 
     c.anchor = GridBagConstraints.LINE_END; 
     panel.add(start, c); 

     JLabel msg1 = new JLabel(
       "<html><p style = 'background-color: white; font-size: 10px'>Click on Start to begin.</p></html>"); 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridx = 0; 
     c.gridy = 1; 
     c.gridheight = 3; 
     c.gridwidth = 4; 
     panel.add(msg1, c); 

     JLabel msg2 = new JLabel(
       "<html><p style = 'background-color: white; font-size: 10px'>Ok, let's begin.</p><p style = 'background-color: white; font-size: 10px'>First question: Is your number even?</html>"); 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridx = 0; 
     c.gridy = 1; 
     c.gridheight = 3; 
     c.gridwidth = 4; 
     panel.add(msg1, c); 

     Moteur moteur = new Moteur(); 
     start.addActionListener(moteur); 

     frame.setContentPane(contenu); 
     frame.setSize(700, 300); 
     frame.setVisible(true); 
     frame.setResizable(false); 
    } 
} 

Вы могли бы заметить, что второй класс имеет некоторый текст на французском, но не волнуйтесь, это не важно. Вот мой второй класс:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Moteur implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 
     msg1.setVisible(false); 
     msg2.setVisible(true); 
    } 
} 

На самом деле, я хочу, чтобы программа, чтобы сделать 'msg1' visibility to false и 'msg2' visibility to true, но я не могу заставить программу работать, потому что второй класс не знаю, что такое «msg1» и «msg2 ». Пожалуйста, помогите мне!

С уважением, -Gab

+0

Любопытно, почему вы используете _two_ метки. Просто используйте _one_ и используйте 'setText()' –

ответ

2

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

Для класса Moteur, чтобы иметь возможность вызывать методы msg1 и msg2, вам нужно передать ссылку на эти два объекта в MOTEUR:

public class Moteur implements ActionListener { 
    private JLabel messageToHide; 
    private JLabel messageToShow; 

    public Moteur(JLabel messageToHide, JLabel messageToShow) { 
     this.messageToHide = messageToHide; 
     this.messageToShow = messageToShow; 
    } 

    public void actionPerformed(ActionEvent e) { 
     messageToHide.setVisible(false); 
     messageToShow.setVisible(true); 
    } 
} 

И тогда, когда вы создаете MOTEUR, вы даете их две этикетки, чтобы скрыть и показать:

Moteur moteur = new Moteur(msg1, msg2); 
0

Есть несколько решений этой проблемы, в целом:

Вы можете сделать Class2 a inner class of Class1:

public class Class1 
{ 
    //This class can access private members of the outter class or Class1 
    private class Class2 implements ActionListener 
    { 
    } 
} 

Вы можете pass a reference to the Class1 in the constructor of the Class2 или вообще передать ссылку на класс 1:

public class Class1 
{ 
    Class2 class2 = new Class2(this);//Passing "this" as a reference 

    public int var = 10; 
} 

public class Class2 implements ActionListener 
{ 
    //Constructor 
    public Class2(Class1 class1){//Receives a reference to Class1 
     //You can access the public fields of class1 
     //If you want to access also private fields use setters and getters 
     class1.var = 20; 
    } 
} 

Для mor е Информация о setters и getters см Документов http://docs.oracle.com/javaee/6/tutorial/doc/gjbbp.html или этот пост на SOF: How do getters and setters work?

0

Использование геттеров и сеттеров для сообщений msg.

Смежные вопросы