当前位置: 首页 > 知识库问答 >
问题:

如何用另一个类的按钮更改JLabel?

凤经国
2023-03-14

我有两个类和一个文本文件数据库,第一个类中的jlabel,我们将其称为class1自动设置为数据库中的数字。现在,在class2中,我有一个小的jframe和一个文本字段,当然还有一个按钮,我在文本字段中的值会覆盖数据库中的值,但问题出在这里。第一个类中的标签在运行时不会更新,但如果我重新启动它,它会显示我想要的值。

如何在程序运行时更新它?我尝试在另一个类的ButtonActionPerformed中更改标签,但它每次都给我一个NullPointException

我怎么解决这个?

java prettyprint-override">package BankrollG;

import java.awt.Graphics;
import javax.swing.JFrame;

public class BGbrain {

    BGbody body = new BGbody();
    JFrame Frame = new JFrame();

    public BGbrain() {
        Frame.setSize(body.width, body.height);
        Frame.setTitle(body.title);
        Frame.setResizable(false);
        Frame.setDefaultCloseOperation(Frame.EXIT_ON_CLOSE);
        Frame.add(body.panel);
        Frame.setLocationRelativeTo(null);
        Frame.setFocusable(true);

        Frame.setVisible(true);
    }

    public static void main(String[] args ) {
        new BGbrain();
    }
}
private JLabel bankroll_label

    public BGbody(){        
        panel.setLayout(null);
        windowComponents();           
    }

    public void windowComponents() {
        // Bankroll database access
        try {
           
            FileReader fr = new FileReader("Bankroll.txt");
            BufferedReader br = new BufferedReader(fr);
            set_bankroll = br.readLine();
                
        } catch(IOException e) {
            System.out.println("FEL MED LÄSNING AV DATABAS /// BGBODY");
        }
    
    }
}
private void AddcurrencyActionPerformed(java.awt.event.ActionEvent evt) {
                    
    String CBR = txt_bankroll.getText();

    try {
        FileWriter fw = new FileWriter("Bankroll.txt");
        PrintWriter pw = new PrintWriter(fw);

        pw.println(CBR);
        pw.close();
    } catch(IOException e) {
        System.out.println("FEL MED INSKRIVNINGEN I DATABASEN");
    }
}         

我希望这让我更容易理解我的问题。这是更多的代码,与此无关,我希望我至少简化了一些。

共有1个答案

岑炯
2023-03-14

您的问题是Java编程中一个基本问题的具体示例--如何在类之间传递信息。有几种方法可以做到这一点,最优雅的方法之一是使用一个“模型”类来保存程序的逻辑代码和关键数据,让一个类通过更改它所保存的文本字符串来更改模型的状态。然后使用侦听器或观察者模式,让模型通知其他类它已经被更改,这样其他类就可以从模型中提取新的信息,即新的字符串。虽然这可能是最好的解决方案,但它可能有点矫枉过正,而且可能超出了您当前的编码水平,所以对您来说,我不建议这样做。

相反,我将推荐一个更简单、不那么优雅的解决方案,让一个类调用另一个类的setter方法,将新字符串推入其中。

作为这里的志愿者回答者,我们有一个问题是,您的问题很难回答,因为它缺乏关键代码,这使得我们很难猜测为什么您的代码行为不端,为什么当您试图运行它时,您会遇到NullPointerException(或NPE)。所以我所能做的就是猜测,但猜测我还是会尝试的。

一个可能的原因是,您有一个NullPointerException是因为ButtonTextFieldClass可能有一个LabelClass变量,但从未初始化该变量,如下所示:

// this guy is null because it is never initialized
private LabelClass labelClass; 

一个简单的解决方案是尝试像这样初始化它:

private LabelClass labelClass = new LabelClass();

但是这是行不通的,因为虽然它创建并分配了一个LabelClass实例,但它很可能不是在运行的GUI中可视化的LabelClass实例。

public void setLabelClass(LabelClass labelClass) {
   this.labelClass = labelClass;
}
class LabelClass extends JPanel {
   private JLabel label = new JLabel("");

   public LabelClass() {
      setBorder(BorderFactory.createTitledBorder("Label Panel"));
      add(label);
   }

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

我让它扩展JPanel,因为这样我可以自由地将它放入JFrame、JDialog或其他我认为合适的JPanel中。请注意,我已经将JLabel设置为私有,并为该类提供了一个公共setter方法setLabelText(String text),它允许外部类设置JLabel的文本。

ButtonTextFieldClass可以类似于:

class ButtonTextFieldClass extends JPanel {
   private JTextField textField = new JTextField(10);
   private JButton button = new JButton(new ButtonAction("Send Text"));
   private LabelClass labelClass;

   public ButtonTextFieldClass() {
      setBorder(BorderFactory.createTitledBorder("Button TextField Panel"));
      add(textField);
      add(button);
   }

   // here we allow other classes to set instances of our LabelClass  
   public void setLabelClass(LabelClass labelClass) {
      this.labelClass = labelClass;
   }

   // ....

我还为按钮提供了一个ActionListener,而不是ActionListener,因为它就像一个服用类固醇的超级ActionListener。在它内部,我将从JTextField获取文本,然后调用LabelClass的setter方法(如果变量不为null)来设置标签的文本:

  public void actionPerformed(ActionEvent e) {
     String text = textField.getText(); 
     if (labelClass != null) {
        labelClass.setLabelText(text);
     }
  }
  LabelClass labelClass = new LabelClass();
  ButtonTextFieldClass buttonTextFieldClass = new ButtonTextFieldClass();
  buttonTextFieldClass.setLabelClass(labelClass); // set our reference
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;

public class TransferData {

   private static void createAndShowGui() {
      LabelClass labelClass = new LabelClass();
      ButtonTextFieldClass buttonTextFieldClass = new ButtonTextFieldClass();
      buttonTextFieldClass.setLabelClass(labelClass); // set our reference

      JPanel mainPanel = new JPanel(new GridLayout(0, 1));
      mainPanel.add(buttonTextFieldClass);
      mainPanel.add(labelClass);

      JFrame frame = new JFrame("TransferData");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class LabelClass extends JPanel {
   private JLabel label = new JLabel("");

   public LabelClass() {
      setBorder(BorderFactory.createTitledBorder("Label Panel"));
      add(label);
   }

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

class ButtonTextFieldClass extends JPanel {
   private JTextField textField = new JTextField(10);
   private JButton button = new JButton(new ButtonAction("Send Text"));

   // one possible solution -- give this class a variable 
   // of the LabelClass -- but don't initialize the variable 
   // here, but rather do it in a setter
   private LabelClass labelClass;

   public ButtonTextFieldClass() {
      setBorder(BorderFactory.createTitledBorder("Button TextField Panel"));
      add(textField);
      add(button);
   }

   // here we allow other classes to set instances of our LabelClass  
   public void setLabelClass(LabelClass labelClass) {
      this.labelClass = labelClass;
   }

   // an AbstractAction is like a "super" ActionListener
   private class ButtonAction extends AbstractAction {
      public ButtonAction(String name) {
         super(name); // set the button's text and actionCommand
         int mnemonic = (int) name.charAt(0); // get first char
         putValue(MNEMONIC_KEY, mnemonic); // set mnemonic
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         String text = textField.getText(); 
         if (labelClass != null) {
            labelClass.setLabelText(text);
         }
      }
   }
}
 类似资料:
  • 所以假设我有一个“开”和一个“关”按钮。当我按下打开按钮时,我希望打开按钮隐藏自己,关闭按钮显示出来,反之亦然。 一个人怎么能这么做?

  • 我刚刚接触Java,正在为我的大学班级做一个项目。我正在开发一款百万富翁游戏,但是我被卡住了。 我有一个JFrame类,其中我有2个面板。第一个由按钮组成,第二个是我想通过按下按钮来更改的面板。按钮具有自己的类及其构造函数,面板也是如此,因为它们具有不同的布局。我需要在按钮类中创建一个方法,以从框架中删除第二个面板并添加第三个面板(在另一个更JPanel类中描述)。因此,从技术上讲,我需要从按钮类

  • 问题内容: 我是java的新手,我被困在这里…我要做的是将一个java文件中arraylist的更改更新为另一个文件中的JPanel。我正在对arraylist进行排序,因此无法手动完成。有什么办法可以让我“告诉” JPanel痛楚吗? 我有进行排序(工作)的BubbleSort.java,有包含JPanel和JFrame类(用于显示未排序的直方图的工作)的Animation.java。 这是家庭

  • RootController类是我需要进行工作的地方。在方法private void handleDelete()中,您可以在注释中看到一些代码,这是一个工作代码,但我无法找到从ContentController类加载数据的方法,这是上面的代码垃圾。 我将感谢任何关于如何使它工作的想法。

  • 我有一个自定义按钮组件,如下所示。 当我点击按钮时,每件事都会例外,按钮文本也在变化。但是当我点击另一个按钮时,我想更改按钮的文本。为此,我调用按钮的onclick方法。但是,当我单击按钮时,即使调用了该方法,文本也不会更改。这是我的页面。

  • 我想做的是禁用一个按钮,当我启用另一个按钮时(因此最多可以激活一个按钮),但我对JS的了解非常基础。任何提示都将不胜感激。 Lorem ipsum dolor sit amet,concetetur adipiscing elit。车辆三体间前庭。前庭等扫描电镜。Ut venenatis sagittis孕妇。Nam enim tortor,lacinia pretium dolor sit am