将控制台 println 移动到 GUI 时,无法从静态上下文引用非静态 JLabel
non-static JLabel cannot be referenced from static context while moving console println into GUI
无论我尝试修改什么,总是有问题,程序不会 运行。
问题是我的程序工作正常,当它在控制台中启动时,一切正常,但是当我尝试制作 GUI 并从 window 中的控制台获取文本时,变量没有'似乎不像以前那样工作了。
程序很简单,一共三个包,如下:
//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 包中还有三个 classes,它们只扩展了 zwierzeta,其中没有代码。
所以问题是,无论我尝试在 magazyn.java 中的 dodajZwierza 中放入什么,总会出现一个错误,提示我不能使用非静态变量 l_rasa
来引用静态上下文。我不知道如何解决这个问题,我试图在 GUI 中将 class 设置为静态,但随着错误的增多,情况变得更糟。
如何让文本显示在 window 而不是控制台中?
您正在尝试访问在 GUI class 中定义为:
的非静态变量
public JLabel l_imie, l_gatunek, l_rasa;
这里:
sklepzoologiczny.GUI.l_rasa.setText
我没有看到它正在初始化,但您可以在 GUI class 中将其定义为静态的,例如:
public static JLabel l_rasa;//initialize it may be and that would resolve your issue.
首先 - 你最好避免使用名称与类型名称相同的成员:
GUI GUI = new GUI();
您 - 和 JVM - 很可能对此感到困惑,不知道您稍后 [=24] 时是要访问 class 类型还是 class 实例=] 类似于:
GUI.setVisible(true);
其次,如果你想让一个class访问另一个class的成员,最好提供一个getter那个returns(参考) 该成员,而不是将该成员定义为静态成员并让其他 classes 直接访问它。
您似乎混淆了 classes 和实例:您想创建一个 class GUI 的实例,然后传递这个实例以便能够使用该实例而不是 class.
在您的主要方法中,您创建了一个 class GUI 的实例:
GUI GUI = new GUI();
你调用GUI的这个实例的变量,同class。 这是一个非常糟糕的主意。 Java 命名约定规定变量名以非大写字母开头,因此您应该这样写:
GUI gui = new GUI();
并相应地更改主要方法的其余部分。
现在,这个实例 gui
就是您要使用的。你必须把它传递给你使用它的方法,然后写成例如
gui.l_rasa.setText(...);
顺便说一句,如果您将 class 的成员变量设为私有,并添加 getter 和 setter 方法来访问它们,您的代码将变得更易于维护。
无论我尝试修改什么,总是有问题,程序不会 运行。
问题是我的程序工作正常,当它在控制台中启动时,一切正常,但是当我尝试制作 GUI 并从 window 中的控制台获取文本时,变量没有'似乎不像以前那样工作了。
程序很简单,一共三个包,如下:
//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 包中还有三个 classes,它们只扩展了 zwierzeta,其中没有代码。
所以问题是,无论我尝试在 magazyn.java 中的 dodajZwierza 中放入什么,总会出现一个错误,提示我不能使用非静态变量 l_rasa
来引用静态上下文。我不知道如何解决这个问题,我试图在 GUI 中将 class 设置为静态,但随着错误的增多,情况变得更糟。
如何让文本显示在 window 而不是控制台中?
您正在尝试访问在 GUI class 中定义为:
的非静态变量public JLabel l_imie, l_gatunek, l_rasa;
这里:
sklepzoologiczny.GUI.l_rasa.setText
我没有看到它正在初始化,但您可以在 GUI class 中将其定义为静态的,例如:
public static JLabel l_rasa;//initialize it may be and that would resolve your issue.
首先 - 你最好避免使用名称与类型名称相同的成员:
GUI GUI = new GUI();
您 - 和 JVM - 很可能对此感到困惑,不知道您稍后 [=24] 时是要访问 class 类型还是 class 实例=] 类似于:
GUI.setVisible(true);
其次,如果你想让一个class访问另一个class的成员,最好提供一个getter那个returns(参考) 该成员,而不是将该成员定义为静态成员并让其他 classes 直接访问它。
您似乎混淆了 classes 和实例:您想创建一个 class GUI 的实例,然后传递这个实例以便能够使用该实例而不是 class.
在您的主要方法中,您创建了一个 class GUI 的实例:
GUI GUI = new GUI();
你调用GUI的这个实例的变量,同class。 这是一个非常糟糕的主意。 Java 命名约定规定变量名以非大写字母开头,因此您应该这样写:
GUI gui = new GUI();
并相应地更改主要方法的其余部分。
现在,这个实例 gui
就是您要使用的。你必须把它传递给你使用它的方法,然后写成例如
gui.l_rasa.setText(...);
顺便说一句,如果您将 class 的成员变量设为私有,并添加 getter 和 setter 方法来访问它们,您的代码将变得更易于维护。