【问题标题】:Clearing a JTextArea from another class从另一个类中清除 JTextArea
【发布时间】:2012-05-05 18:46:19
【问题描述】:

我对 Java 很陌生,我正在为自己设定一个编写凯撒移位密码解码器的挑战。我基本上是在尝试从另一个类中清除 JTextArea。我有两个类,一个叫做 CrackerGUI 的 GUI 类和一个 shift 类。 JtextArea 与以下方法一起位于 GUI 类中:

public void setPlainTextBox(String text)
{
    plainTextBox.setText(text);
}

GUI 类还有一个带有以下内容的清除按钮:

private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {                                         
    Shift classShift = new Shift();
    classShift.btnClear(); 
}   

最后我在 shift 类中有清除 JTextArea 的方法。

public class Shift extends CrackerGUI {

public void btnClear()
{
    CrackerGUI gui = new CrackerGUI();
    gui.setPlainText(" ");
    System.out.println("testing");
} 
}

测试文本正在打印到控制台,但 JTextArea 不会清除。我不确定为什么:)。我确信这是一个非常简单的错误,但它让我感到困惑。任何帮助将不胜感激。

提前谢谢你。

【问题讨论】:

    标签: java swing inheritance jtextarea


    【解决方案1】:

    您滥用继承来解决不涉及继承的问题。不要让 Shift 扩展 CrackerGUI 并且不要在 btnClear() 方法内创建新的 CrackerGUI 对象,因为 CrackerGUIi 都不是显示的对象。而是让 Shift 持有对显示的 CrackerGUI 对象的引用,并让它调用该对象的公共方法。

    例如,

    public class Shift  {
      private CrackerGUI gui;
    
      // pass in a reference to the displayed CrackerGUI object
      public Shift(CrackerGUI gui) {
        this.gui = gui;
      }
    
      public void btnClear() {
        //CrackerGUI gui = new CrackerGUI();
        gui.setPlainText(" ");
        System.out.println("testing");
      } 
    }
    

    您也不应该在 GUI 的 actionPerformed 方法中创建新的 Shift 对象,而应该只使用一个作为类字段的 Shift 对象。

    【讨论】:

      【解决方案2】:

      btnClear 方法清除新 CrackerGUI 实例的文本区域。这就像如果您想通过拿一张新的空白纸并清除它来清除一张纸上的绘图。原始纸张将保留其绘图。

      您需要将 gui 实例传递给您的 Shift:

      public class Shift { 
          private CrackerGUI gui;
      
          public Shift(CrackerGUI gui) {
              this.gui = gui;
          }
      
          public void btnClear() {
              this.gui.setPlainText(" ");
          }
      }
      

      在 CrackerGUI 类中:

      private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {                                         
          Shift classShift = new Shift(this);
          classShift.btnClear(); 
      }   
      

      【讨论】:

        【解决方案3】:

        假设 CrackerGUI 是您的 GUI,您应该有以下内容:

        public class CrackerGUI {
        
          public void setPlainTextBox(String text)
          {
            plainTextBox.setText(text);
          }
          public void btnClear()
          {
            setPlainTextBox("");
            System.out.println("testing");
          } 
        }
        

        最后一件事,永远不要公开你的 GUI 元素!您应该要求 GUI 自行清除并将清除元素的知识隐藏在其中。

        【讨论】:

        • 为什么 Shift 扩展 CrackerGUI?
        • @HovercraftFullOfEels 哎呀!这是一个小错误实际上不需要扩展GUI本身
        【解决方案4】:

        您可以尝试使用静态方法,因为您最终会创建一个新的 gui,然后显示那个,而不是当前已经显示的。

        这将要求父类也是静态的,这可能会导致您的某些方法出现错误,请注意。

        或者,您可以创建自己的 setText 方法:

        void setText(JTextField t, String s){
          t.setText(s);
        }
        

        这可能使您能够直接编辑当前 GUI 中的组件。

        【讨论】:

        • 没有。不要把婴儿和洗澡水一起扔——不要把 OOP 编程的好处丢掉> 通过使用 OOP 技术。
        • 当我什至说有替代品时,不必成为一个家伙。
        • @Firexranger8:您的静态解决方案很糟糕。此外,除了内部类,Java 中没有静态类。你的选择根本没有意义。哦,你也太不礼貌了。
        猜你喜欢
        • 1970-01-01
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 2013-04-21
        • 2015-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多