java - 我无法从另一个类设置 JLabel 的文本

标签 java swing

我有一个 JLabel,我需要从另一个类对其进行 setText。我们将其称为 JLabel soupLabel。

soupLabel 位于 JPanel 类(类扩展 JPanel)中,称为 SoupPage。 SoupPage实际上是mainGUI类的一张卡片。

我有另一个类,称为确认类(类扩展 JFrame)。该类是在 Soup Class 中按下按钮后弹出的。

我尝试从确认类设置文本 soupLabel (位于 Soup 类中),但无济于事。

主GUI

public class mainGUI extends JFrame{
    private CardLayout card;

    public mainGUI(){
       card = new CardLayout();
       setLayout(card);
    }

    private void createSoupPage(){
    SoupPage sp = new SoupPage(this);
    add(sp, "Soup Page");
    }
}

已编辑:带有确认弹出的 SoupPage

public class SoupPage extends JPanel{
    mainGUI gui;
    public JLabel soupLabel;
    public JButton cfmBtn;

    public SoupPage(mainGUI gui){
        this.gui = gui;

        soupLabel = new JLabel("blabla");

        cfmBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Confirmation cfmPopUp = new Confirmation();
            }
        });
    }
}

确认

public class Confirmation extends JDialog{
    JButton clrBtn;

    public Confirmation(){
         SoupPage sp = new SoupPage();

         clrBtn = new JButton("Clear");
         clrBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            sp.soupLabel.setText("some other text bla bla");
            }
         });
    }
}

这是不起作用的部分。

最佳答案

这永远不会起作用。这是因为您正在尝试设置从未添加到 mainGUI 的不同 SoupPage 对象的 soupLabel 文本。您需要做的是设置在 mainGUI 类中声明的 SoupPage 类实例的 souplabel 的文本。您应该做什么?
1. 不要使用 JFrame 进行弹出。将其更改为 JDialog。当任务栏中出现两个图标时,看起来很奇怪,而且可能存在焦点问题。
2. 接下来,为了解决您的实际问题,请在 mainGUI 中的私有(private)方法之外声明一个 SoupPage 实例。然后像这样重新定义您的Confirmation类

  public class Confirmation extends JDialog{
    JButton clrBtn;

    public Confirmation(SoupPage sp){

         clrBtn = new JButton("Clear");
         clrBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            sp.soupLabel.setText("some other text bla bla");
            }
         });
    }
}

现在,当从 mainGUI 调用确认时,只需传递在那里声明的实例。 更新
尝试一下我修改了所有三个类并进行测试的代码,它将根据您的需求完美地工作

class mainGUI extends JFrame{
    private CardLayout card;
    private SoupPage sp;

    mainGUI(){
       card = new CardLayout();
       setLayout(card);
    }

    private void createSoupPage(){
      sp = new SoupPage(this);
      add(sp,"Soup Page");
    }

    public void setSoupPageText(String text){
      sp.soupLabel.setText(text);
    }


}

class SoupPage extends JPanel{
    mainGUI gui;
    JLabel soupLabel;
    JButton cfmBtn;

    SoupPage(mainGUI gui){
        this.gui = gui;

        soupLabel = new JLabel("blabla");

        cfmBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Confirmation cfmPopUp = new Confirmation(gui);
            }
        });
    }
}



class Confirmation extends JDialog{
    JButton clrBtn;

    Confirmation(mainGUI gui){

         clrBtn = new JButton("Clear");
         clrBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            gui.setSoupPageText("some other text bla bla");
            }
         });
    }
}

关于java - 我无法从另一个类设置 JLabel 的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25095554/

相关文章:

java - 如何通过单击 JButton 清除 JTextField

java - 为什么持久化实体两次可以避免带有连接列的实体级联错误

java - Angular2 Spring启动日期序列化

java - 为什么这个正则表达式会杀死 Java 正则表达式引擎?

java - 将 mySQL 和 MS Access DB 用于仅包含单个数据表的 Java 应用程序

Java:JComboBox 不接受 enum.values()

java - 使用内部框架在另一个 GUI 中显示一个 GUI

java - ElasticsearchIntegrationTest 失败并出现 NullPointerException

java - 返回用户最近进行的交易

java - 如何使用 BoxLayout 让组件与 JPanel 中的顶部对齐?