Een JTextArea van een andere klasse verwijderen

Ik ben erg nieuw voor Java en ik stel mezelf voor de uitdaging om een ​​Caesar-schakelversleutelingscodeur te schrijven. Ik probeer in feite een JTextArea uit een andere klas te wissen. Ik heb twee klassen, een GUI-klasse genaamd CrackerGUI en een shiftklasse. De JtextArea bevindt zich in de GUI-klasse, samen met de volgende methode:

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

De GUI-klasse heeft ook een duidelijke knop met de volgende:

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

Ten slotte heb ik de methode in de shift-klasse om de JTextArea leeg te maken.

public class Shift extends CrackerGUI {

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

De testtekst wordt afgedrukt naar de console, maar de JTextArea wordt niet gewist. Ik weet niet zeker waarom :). Ik weet zeker dat het een heel eenvoudige vergissing is, maar het verbaast me. Alle hulp wordt op prijs gesteld.

Dank u bij voorbaat.

0

4 antwoord

Met de methode btnClear wordt het tekstgedeelte van een nieuw CrackerGUI-exemplaar gewist. Het is net of u een tekening op een vel papier wilt wissen door een nieuw leeg vel te nemen en het op te ruimen. Het originele vel papier blijft op tekening.

U moet de gui-instantie doorgeven aan uw Shift:

public class Shift { 
    private CrackerGUI gui;

    public Shift(CrackerGUI gui) {
        this.gui = gui;
    }

    public void btnClear() {
        this.gui.setPlainText(" ");
    }
}

en in de CrackerGUI-klasse:

private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {                                         
    Shift classShift = new Shift(this);
    classShift.btnClear(); 
}   
3
toegevoegd
grote geesten denken hetzelfde. 1+
toegevoegd de auteur Hovercraft Full Of Eels, de bron

Je misbruikt erfenis om een ​​probleem op te lossen dat geen overerving inhoudt. Laat Shift CrackerGUI niet uitbreiden en maak geen nieuw CrackerGUI-object in de btnClear() -methode, aangezien CrackerGUi niet degene is die wordt weergegeven. Houd Shift in plaats daarvan een verwijzing naar het weergegeven CrackerGUI-object en laat dit een openbare methode van dit object noemen.

b.v.

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");
  } 
}

U moet waarschijnlijk ook geen nieuwe Shift-objecten maken in de door uw GUI-actie Geperformeerde methoden, maar eerder slechts één Shift-object gebruiken dat een klassenveld is.

3
toegevoegd
grote geesten denken hetzelfde. 1+
toegevoegd de auteur JB Nizet, de bron
+1 Goed punt over het OOP-spul.
toegevoegd de auteur GETah, de bron

U zou kunnen proberen statische methoden te gebruiken, omdat u uiteindelijk een nieuwe gui zou maken en die dan zou tonen, in plaats van de huidige die al wordt getoond.

Dit zou vereisen dat de ouderklasse ook statisch is, wat fouten in sommige van uw methoden kan veroorzaken, alleen maar een heads-up.

Of anders kunt u uw eigen setText-methode maken:

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

waarmee u mogelijk rechtstreeks componenten in de huidige GUI kunt bewerken.

2
toegevoegd
@ Firexranger8: uw statische oplossing is slecht. Bovendien, behalve voor innerlijke klassen, is er geen statische klasse op Java. En jouw alternatief heeft helemaal geen zin. Oh, en jij bent ook onbeleefd.
toegevoegd de auteur JB Nizet, de bron
Nee. Gooi de baby niet met het badwater - gooi de voordelen van de OOP-programmering niet weg met behulp van statische alles om dit probleem op te lossen, dat veel gemakkelijker kan worden opgelost en door OOP-technieken te gebruiken.
toegevoegd de auteur Hovercraft Full Of Eels, de bron
Je hoeft geen lul te zijn als ik zelfs zeg dat er afwisselend zijn.
toegevoegd de auteur Matt, de bron

Ervan uitgaande dat CrackerGUI uw GUI is, moet u in plaats daarvan het volgende hebben:

public class CrackerGUI {

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

Nog één ding: maak je GUI-elementen nooit openbaar! Je zou de GUI moeten vragen om zichzelf op te ruimen en die kennis van opruimelementen achter te laten.

0
toegevoegd
Waarom heeft Shift CrackerGUI uitgebreid?
toegevoegd de auteur Hovercraft Full Of Eels, de bron
@HovercraftFullOfEels Oeps! Het was een klein foutje dat er eigenlijk geen reden was om de GUI zelf uit te breiden
toegevoegd de auteur GETah, de bron