2015-01-20 5 views
0

항상 수정하려고 시도하고 프로그램이 실행되지 않습니다.콘솔 println을 GUI로 이동하는 동안 정적 컨텍스트에서 비 정적 JLabel을 참조 할 수 없습니다.

문제는 내 프로그램이 콘솔에서 실행될 때 모든 것이 정상이지만 GUI를 만들고 콘솔의 텍스트를 콘솔에서 가져올 때 변수가 작동하지 않는 것입니다. 그들은 있었다.

프로그램

는이 같은 세 가지 패키지가 매우 간단하다 :

//class SklepZoologiczny in package sklepzoologiczny 


package sklepzoologiczny; 

import javax.swing.JFrame; 
import zwierzeta.*; 
import magazyn.*; 

public class SklepZoologiczny { 

    public static void main(String[] args) { 

     GUI GUI = new GUI(); 
     GUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     GUI.pack(); 
     GUI.setSize(300, 500); 
     GUI.setVisible(true); 
     GUI.setTitle("Appka Zaliczeniowa - Sklep Zoologiczny"); 
     GUI.setResizable(false); 
     GUI.setLocationRelativeTo(null); 

    } 

} 

//class GUI in package sklepzoologiczny 


package sklepzoologiczny; 

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import magazyn.*; 
import zwierzeta.*; 

public class GUI extends JFrame { 

    public JLabel l_imie, l_gatunek, l_rasa; 
    public JButton b_dodaj, b_usun, b_lista; 
    public JTextField tf_imie, tf_gatunek, tf_rasa; 
    public String imie, gatunek, rasa; 
    public ArrayList lista_psow, lista_kotow; 
    public String pies, kot, gatunek_zwierza; 
    public String imie_psa, rasa_psa; 
    public String imie_kota, rasa_kota; 

    public GUI() { 

     setLayout(new FlowLayout()); 

     b_dodaj = new JButton("Uruchom Program"); 
     add(b_dodaj); 

     l_imie = new JLabel("Text from console to GUI should go here"); 
     add(l_imie); 

     event dodanie = new event(); 
     b_dodaj.addActionListener(dodanie); 

    } 

    public class event implements ActionListener { 

     public void actionPerformed(ActionEvent dodanie) { 



      magazyn magazyn1 = new magazyn(); 
      magazyn1.kasa = 0;  

      pies pies1 = new pies(); 
      kot kot1 = new kot(); 
      krolik krolik1 = new krolik(); 

      pies1.ustawImie("Max"); 
      kot1.ustawImie("Nuta"); 
      krolik1.ustawImie("Filip"); 

      pies1.ustawCene(200); 
      kot1.ustawCene(100); 
      krolik1.ustawCene(50); 

      pies1.ustawRase("Jamnik"); 
      kot1.ustawRase("Perski"); 
      krolik1.ustawRase("Mini_Lop"); 

      pies1.ustawGatunek("pies"); 
      kot1.ustawGatunek("kot"); 
      krolik1.ustawGatunek("krolik"); 

      System.out.println("Operacje Zakupu Zwierzat"); 
      System.out.println("---"); 

      magazyn1.dodajZwierza(pies1); 
      magazyn1.dodajZwierza(kot1); 
      magazyn1.dodajZwierza(krolik1); 

      magazyn1.StanSklepu(); 

      System.out.println("Transkacje"); 
      System.out.println("---"); 

      magazyn1.sprzedajZwierza("Nuta"); 

      magazyn1.StanSklepu(); 

      } 
     } 

    } 

//class magazyn in package magazyn 


package magazyn; 

import java.util.ArrayList; 
import zwierzeta.*; 

public class magazyn { 

    public float kasa; 
    ArrayList <zwierzeta> lista = new ArrayList(20); 



     public void dodajZwierza(zwierzeta i){ 

      lista.add(i); 
      sklepzoologiczny.GUI.l_rasa.setText("Do sklepu dodano zwierza o imieniu: " + i.wezImie()); 

     } 

     public void sprzedajZwierza(String i){ 

      for(int j=0; j<lista.size(); j++){ 

       if(lista.get(j).wezImie() == i){ 

        kasa = kasa + lista.get(j).wezCene(); 
        lista.remove(j); 
        System.out.println("Sprzedano: " + i); 
       } 

      } 
     } 

     public void StanSklepu(){ 
      System.out.println("Aktualny stan sklepu:"); 
      for(int i=0; i<lista.size(); i++){ 
       System.out.println(lista.get(i).wezImie()+", " +lista.get(i).wezGatunek()+", " + lista.get(i).wezRase() + ", cena: " + lista.get(i).wezCene()); 
      } 
      System.out.println("Stan kasy \t\t\t" + kasa); 
     } 
    } 

//class zwierzeta in package zwierzeta 


package zwierzeta; 


public abstract class zwierzeta { 
    String imie, gatunek, rasa; 
    float cena; 

    /* public void checkProduct() throws ProductException{ 
     if(isDamaged == true){ 
      ProductException damaged = new ProductException(); 
      damaged.setErrorMessage("Product is damaged:"); 
      throw damaged; 
     } 
    }*/ 

    public void ustawImie(String i){ 
     imie = i; 
    } 

    public String wezImie(){ 
     return imie; 
    } 

    public void ustawGatunek(String i){ 
     gatunek = i; 
    } 

    public String wezGatunek(){ 
     return gatunek; 
    } 

    public void ustawRase(String i){ 
     rasa = i; 
    } 

    public String wezRase(){ 
     return rasa; 
    } 

    public void ustawCene(float i){ 
     cena = i; 
    } 

    public float wezCene(){ 
     return cena; 
    } 

} 

만에없는 코드 zwierzeta를 확장 패키지 zwierzeta에서 세 개의 클래스도 있습니다.

그래서 문제는 magazyn.java의 dodajZwierza에 넣으려고 시도 할 때 정적이 아닌 변수 l_rasa을 정적 컨텍스트에서 참조 할 수 없다는 오류가 항상 있습니다. 이 문제를 해결하는 방법을 모르겠다. GUI에서 클래스를 정적으로 만들려고 시도했지만 더 많은 오류가 발생하면 더 악화된다.

콘솔 대신 창에 텍스트가 나타나게하려면 어떻게해야합니까? 여기

public JLabel l_imie, l_gatunek, l_rasa; 

: 당신은 같은 GUI 클래스에 정의 된 비 정적 변수에 액세스하려고

답변

0

sklepzoologiczny.GUI.l_rasa.setText 

나는 그것이 초기화되는 것을 볼 해달라고하지만 GUI에 정적으로 정의 할 수 있습니다 좋아요 :

public static JLabel l_rasa;//initialize it may be and that would resolve your issue. 
+0

당신이 최고입니다,이 작품! 이전에 전체 GUI에 정적을 추가하려고 했으므로 오류가 발생했습니다. 하지만 또 다른 질문이 있습니다. 3 줄의 텍스트가 있어야하는데,이 수정으로 마지막 줄만 표시됩니다. 어떻게 실제 3 줄로 나눌 수 있습니까? 어떻게 든 JLabel을 한 줄 이상 길게 만들 수 있습니까? 아니면 다른 종류의 라벨을 사용할 수 있습니까? – user3762968

+0

'public JLabel l_imie, l_gatunek;처럼 다른 두 레이블을 유지하지 마라. 이제 다른 줄에서 정적 버전을'public static JLabel l_rasa'로 사용한다. – SMA

+0

나는 당신이 말한대로 다음과 같이 두 줄을 추가했다. public void 도다 지어에 자 (zwierzeta i) { lista.add (i); sklepzoologiczny.GUI.l_imie.setText (i.wezImie()); sklepzoologiczny.GUI.l_imie2.setText (i.wezImie()); sklepzoologiczny.GUI.l_imie3.setText (i.wezImie()); } 도 레이블이 추가되었지만 실행 후 GUI에있는 테이블의 다양한 3 개가 아니라 동일한 3 개의 동물이 나열됩니다. 콘솔에서 모든 것은 괜찮습니다. 어떤 아이디어? – user3762968

1

우선 - 유형과 동일한 이름을 가진 회원을 사용하지 않는 것이 좋습니다. 이름 :

:

GUI GUI = new GUI(); 

당신 - - 그리고 JVM되지는 클래스 형 또는 나중에 뭔가를 실행하는 클래스 인스턴스에 액세스하려고 여부를 알고,이 혼란을 얻을 가능성이 이상하다

GUI.setVisible(true); 

둘째, 한 클래스가 다른 클래스의 멤버에 액세스하게하려면 멤버를 정적으로 정의하는 대신 (해당 참조를) 반환하는 getter를 제공하고 다른 클래스 직접 액세스하십시오.

1

클래스와 인스턴스를 병합하는 것처럼 보입니다. GUI 클래스의 인스턴스를 만든 다음이 인스턴스를 전달하여 클래스가 아닌 인스턴스를 사용할 수있게하려고합니다. 당신이 GUI 클래스와 같은 호출이 인스턴스를 참조

GUI GUI = new GUI(); 

변수 : 주요 방법에서

, 당신은 클래스 GUI의 인스턴스를 만듭니다. 이것은 매우 나쁜 생각입니다. 자바 명명 규칙은 변수 이름이 아닌 대문자로 시작하는 것이 지시, 그래서 당신은 작성해야 :

GUI gui = new GUI(); 

을하고 그에 따라 주요 방법의 나머지 부분을 변경합니다.

이제이 인스턴스gui을 사용하고 싶습니다. 당신이 클래스의 멤버 변수는 비공개로하고, getter 및 setter를 추가하면 당신은 당신이 그것을 사용하는 방법에 전달하고 그런데 예를

gui.l_rasa.setText(...); 

위해 작성해야합니다, 당신의 코드가 더 유지 보수됩니다 그들을 액세스하는 방법.