简体   繁体   English

使用和显示来自differentnet类的JLabel

[英]Using and displaying a JLabel from a differnet class

I am a beginner java programmer. 我是初学者Java程序员。 I have two classes both in package1. 我在package1中有两个类。 I am trying to use a JLabel from another class in Main , here are the two pieces of code: 我正在尝试使用Main中另一个类的JLabel,这是两段代码:

package package1;
import package1.*;

import javax.swing.*;

import java.awt.event.*;

public class Main extends JPanel implements ActionListener {
//Event Text
    protected static JLabel eventText;
    public void event1() {
    eventText = event1.event1EventText;
   }
   private static void createAndShowGUI() {
        JFrame frame = new JFrame("Stack Overflow");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Main newContentPane = new Main();
        newContentPane.setOpaque(true);
        frame.setContentPane(newContentPane);
        frame.setSize(1300, 700);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();  
            }
        });
    }
}

My second file just makes a JLabel. 我的第二个文件只是制作了一个JLabel。

package package1;

import javax.swing.*;

public class event1 extends JPanel {
    protected static JLabel event1EventText;
    public static void main(String[] args) {
        event1EventText = new JLabel();
        event1EventText.setText("Some text");
    }
}

I need to use event1EventText in Main . 我需要在Main中使用event1EventText。 I do not get any error when I run the code but eventText never displays. 运行代码时没有出现任何错误,但eventText从不显示。 I just get a empty window. 我只是得到一个空的窗口。

哦,我认为问题是您没有将main类中的eventText放在方法createAndShowGUI中的框架中。

Try this solution :-

package package1;

import javax.swing.*;

import java.awt.event.*;

public class Main extends JPanel implements ActionListener {
//Event Text
    protected static JLabel eventText;
    public static void event1() {
    eventText = event1.createLabel();
   }
   private static void createAndShowGUI() {
        JFrame frame = new JFrame("Stack Overflow");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        event1();
        Main newContentPane = new Main();
        newContentPane.add(eventText);
        newContentPane.setOpaque(true);
        frame.setContentPane(newContentPane);
        frame.setSize(1300, 700);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();  
            }
        });
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub

    }
}


package package1;

import javax.swing.*;

public class event1 extends JPanel {
    protected static JLabel event1EventText;
    protected static JLabel createLabel(){
         event1EventText = new JLabel();
         event1EventText.setText("Some text");
         return event1EventText;
    }
}

Your question is a little vague and the solution might differ based on more context, however, generally, if you have components in another component, you don't want to allow direct access to them, as it's too easy for other parts your program to do things to them that they really shouldn't be doing. 您的问题有点含糊,根据更多的上下文,解决方案可能会有所不同,但是,通常,如果您在另一个组件中有组件,则您不想允许直接访问它们,因为程序的其他部分太容易了对他们做他们本不该做的事情。

Instead, one approach is to provide setters and getters to change the state of the label indirectly, for example... 相反,一种方法是提供setter和getter来间接更改标签的状态,例如...

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test100 {

    public static void main(String[] args) {
        new Test100();
    }

    public Test100() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                TestPane pane = new TestPane();
                pane.setLabelText("Look, I'm a label on another panel");

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(pane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JLabel label;

        public TestPane() {
            setLayout(new GridBagLayout());
            label = new JLabel();
            add(label);
        }

        public void setLabelText(String text) {
            label.setText(text);
        }

    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM