Очистка JTextArea от другого класса - PullRequest
0 голосов
/ 07 декабря 2011

Я очень плохо знаком с Java и ставлю перед собой задачу написать шифровальный декодер Цезаря.Я в основном пытаюсь очистить JTextArea от другого класса.У меня есть два класса, класс GUI под названием CrackerGUI и класс смены.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(); 
}   

Наконец, у меня есть метод всдвиньте класс, чтобы очистить JTextArea.

public class Shift extends CrackerGUI {

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

Тестовый текст распечатывается на консоль, но JTextArea не очищается.Я не уверен, почему :).Я уверен, что это очень простая ошибка, но она сбила меня с толку.Буду признателен за любую помощь.

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 07 декабря 2011

Метод btnClear очищает текстовую область нового экземпляра CrackerGUI. Это как если бы вы хотели очистить рисунок на листе бумаги, взяв новый чистый лист и очистив его. Оригинальный лист бумаги сохранит свой рисунок.

Вам нужно передать экземпляр графического интерфейса вашему 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 голосов
/ 07 декабря 2011

Вы неправильно используете наследование для решения проблемы, которая не связана с наследованием.Не разрешайте Shift расширять CrackerGUI и не создавайте новый объект CrackerGUI внутри метода btnClear (), поскольку ни один из отображаемых CrackerGUi не отображается.Вместо этого пусть 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");
  } 
}

Возможно, вам также не следует создавать новые объекты Shiftметоды actionPerformed вашего графического интерфейса, но лучше использовать только один объект Shift, который является полем класса.

0 голосов
/ 07 декабря 2011

Предполагая, что CrackerGUI является вашим графическим интерфейсом, вы должны иметь вместо этого:

public class CrackerGUI {

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

И последнее, никогда не делайте ваши элементы графического интерфейса публичными! Вы должны попросить графический интерфейс очистить себя и оставить это знание об очистке элементов скрытым внутри него.

0 голосов
/ 07 декабря 2011

Вы можете попробовать использовать статические методы, так как в конечном итоге вы создадите новый графический интерфейс, а затем отобразите его вместо текущего, уже отображенного.

Для этого родительский класс также должен быть статическим, что может привести к ошибкам в некоторых из ваших методов, просто один на один.

Или вы можете создать свой собственный метод setText:

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

, который может позволить вам напрямую редактировать компоненты в текущем графическом интерфейсе.

...