将控制台println移动到GUI时,无法从静态上下文引用非静态JLabel

时间:2015-01-20 12:31:07

标签: java static jframe jlabel non-static

无论我尝试修改什么,总会出现问题,程序也无法运行。

问题是我的程序运行正常,当它在控制台中启动时,一切正常,但是当我尝试创建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中将类设置为静态,但它会因为更多错误而变得更糟。

如何让文本显示在窗口而不是控制台?

3 个答案:

答案 0 :(得分:1)

首先 - 最好避免使用名称与类型名称相同的成员:

GUI GUI = new GUI();

你和JVM很可能会因此而感到困惑,不知道你是否在以后运行类似的东西时试图访问类类型或类实例:

GUI.setVisible(true);

其次,如果你想让一个类访问另一个类的成员,那么提供一个返回(引用)该成员的getter要好得多,而不是将该成员定义为static而让其他类访问直接。

答案 1 :(得分:1)

您似乎要混淆类和实例:您希望创建类GUI的实例,然后传递此实例以便能够使用实例而不是类。

在main方法中,您将创建类GUI的实例:

GUI GUI = new GUI(); 

引用此实例的变量,您调用GUI,与该类相同。 这是一个非常糟糕的主意。 Java命名约定规定变量名称以非大写字母开头,因此您应该写:

GUI gui = new GUI();

并相应地更改主方法的其余部分。

现在,您想要使用此实例 gui。您必须将它传递给您使用它的方法,然后编写例如

gui.l_rasa.setText(...);

顺便说一下,如果将类的成员变量设为private,则代码变得更易于维护,并添加getter和setter方法来访问它们。

答案 2 :(得分:0)

您正尝试访问GUI类中定义的非静态变量:

public JLabel l_imie, l_gatunek, l_rasa;

下面:

sklepzoologiczny.GUI.l_rasa.setText

我没有看到它被初始化,但您可以在GUI类中将其定义为静态,如:

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