为什么JTextArea.append()不显示任何内容?

时间:2014-10-13 18:13:47

标签: java swing jtextarea

我有两个班级:

public class VentanaPrincipal extends javax.swing.JFrame 
{
    MetodosFicheros objMetodosFicheros;

    public void ListadoTextArea(String textLine) 
    {
        listadoTextArea.append(textLine);
    }    


    private void datosButtonActionPerformed(java.awt.event.ActionEvent evt)
    {                                            
        objMetodos = new MetodosFicheros();
        objMetodos.leerFichero();
    }
} 


public class MetodosFicheros
{
    private VentanaPrincipal objVentana;

    public void leerFichero()
    {
        String textLine;
        objVentana.ListadoTextArea(textLine);
    }
}

我想打印" textLine" in" listadoTextArea"但它什么都不显示。如果我使用System.out.println(textLine)代替listadoTextArea.append(textLine),则控制台会显示" textLine"正确。所以,我不知道错误在哪里。


对不起,代码的大部分内容都在这里。

public class VentanaPrincipal extends javax.swing.JFrame 
{

private String clave;
private String nombre;
private int edad;
private float sueldo; 
private MetodosFicheros objMetodos;


public VentanaPrincipal() 
{
    initComponents();
}

public void ListadoTextArea(String textLine) 
{
    listadoTextArea.append(textLine);
}    

private void datosButtonActionPerformed(java.awt.event.ActionEvent evt {                                            
    objMetodos = new MetodosFicheros();
    objMetodos.leerFichero();
 }


private void initComponents() {

    jPanel1 = new javax.swing.JPanel();
    jLabel2 = new javax.swing.JLabel();
    jLabel3 = new javax.swing.JLabel();
    jLabel4 = new javax.swing.JLabel();
    jLabel5 = new javax.swing.JLabel();
    claveText = new javax.swing.JTextField();
    edadText = new javax.swing.JTextField();
    sueldoText = new javax.swing.JTextField();
    nombreText = new javax.swing.JTextField();
    grabarButton = new javax.swing.JButton();
    jPanel2 = new javax.swing.JPanel();
    datosButton = new javax.swing.JButton();
    indicesButton = new javax.swing.JButton();
    indicesDatosButton = new javax.swing.JButton();
    ordenarButton = new javax.swing.JButton();
    jScrollPane1 = new javax.swing.JScrollPane();
    listadoTextArea = new javax.swing.JTextArea();
    jPanel3 = new javax.swing.JPanel();
    jLabel6 = new javax.swing.JLabel();
    claveBuscarText = new javax.swing.JTextField();
    indiceSinOrdenarButton = new javax.swing.JButton();
    indiceOrdenadoButton = new javax.swing.JButton();
    busquedaDicotomica = new javax.swing.JButton();
    jLabel7 = new javax.swing.JLabel();
    jLabel8 = new javax.swing.JLabel();
    jLabel9 = new javax.swing.JLabel();
    jLabel10 = new javax.swing.JLabel();
    nombreBuscarText = new javax.swing.JTextField();
    edadBuscarText = new javax.swing.JTextField();
    sueldoBuscarText = new javax.swing.JTextField();
    registrosText = new javax.swing.JTextField();
    jLabel1 = new javax.swing.JLabel();
    indiceText = new javax.swing.JTextField();
    errorText = new javax.swing.JTextField();
}

    // Variables declaration - do not modify                     
private javax.swing.JButton busquedaDicotomica;
private javax.swing.JTextField claveBuscarText;
private javax.swing.JTextField claveText;
private javax.swing.JButton datosButton;
private javax.swing.JTextField edadBuscarText;
private javax.swing.JTextField edadText;
private javax.swing.JTextField errorText;
private javax.swing.JButton grabarButton;
private javax.swing.JButton indiceOrdenadoButton;
private javax.swing.JButton indiceSinOrdenarButton;
private javax.swing.JTextField indiceText;
private javax.swing.JButton indicesButton;
private javax.swing.JButton indicesDatosButton;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel10;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JLabel jLabel8;
private javax.swing.JLabel jLabel9;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea listadoTextArea;
private javax.swing.JTextField nombreBuscarText;
private javax.swing.JTextField nombreText;
private javax.swing.JButton ordenarButton;
private javax.swing.JTextField registrosText;
private javax.swing.JTextField sueldoBuscarText;
private javax.swing.JTextField sueldoText;
}                                          

public class MetodosFicheros
{
public MetodosFicheros(){}


private VentanaPrincipal objVentana;
private String dialogo = "No se ha encontrado el fichero";
private String fileName = "FicherosDatos.dat";
private JTextField JTextField;
private JTextArea JTextArea;


/****************************************************************************************
**Metodo que graba en un fichero ".dat" los valores introducidos en la interfaz grafica**
*****************************************************************************************/
public void grabarFichero(String clave, String nombre, int edad, float sueldo)
{
    objVentana = new VentanaPrincipal();
    DataOutputStream fichero = new DataOutputStream(new FileOutputStream(fileName, true));
    fichero.writeUTF(clave);
    fichero.writeUTF(nombre);
    fichero.writeInt(edad);
    fichero.writeFloat(sueldo);
}

public void leerFichero()
{
    String textLine;
    JTextArea = new JTextArea();
    FileReader fichero = null;
    BufferedReader reader;
    objVentana = new VentanaPrincipal();
    fichero = new FileReader(fileName);
    reader = new BufferedReader(fichero);
    while((textLine = reader.readLine()) != null)
    {
       objVentana.ListadoTextArea(textLine);
    }
  }
}

1 个答案:

答案 0 :(得分:1)

猜测,也许你的问题是由于改变了错误引用的状态 - 你可能已经创建了第二个对象,并且正在改变第二个对象的状态,而不是当前显示的状态。

这里的关键是下面的objVentana变量:

public class MetodosFicheros
{
    private VentanaPrincipal objVentana;

    public void leerFichero()
    {
        String textLine;
        objVentana.ListadoTextArea(textLine);
    }
}

如何为其指定参考?您是否100%确定它实际上是指显示的VentanaPrincipal,或者代码中的某处未显示调用new VentanaPrincipal()创建新引用,并且您正在调用方法。我敢打赌,这正是你正在做的事情。

但更重要的是,无论我是对还是错,你都应该努力改善你的问题,因为它缺少关键信息,这些信息可以让我们在没有猜测的情况下帮助你。 / p>


修改
是的,我是对的。正如我所提到的,你所要做的就是搜索你的代码new VentanaPrincipal(),每当你看到它时,你就知道你正在创建一个新的VentanaPrincipal窗口对象,它完全不同于那个对象。显示:

public void leerFichero()
{
    String textLine;
    JTextArea = new JTextArea();
    FileReader fichero = null;
    BufferedReader reader;
    objVentana = new VentanaPrincipal(); // ********* here **********
    fichero = new FileReader(fileName);
    reader = new BufferedReader(fichero);
    while((textLine = reader.readLine()) != null)
    {
       objVentana.ListadoTextArea(textLine);
    }
  }
}

解决方案是来创建一个新的VentanaPrincipal,而是将对当前查看的VentanaPrincipal对象的引用传递到MetodosFicheros对象,然后在其上调用方法。

所以将MetodosFicheros改为

public class MetodosFicheros {
   private VentanaPrincipal objVentana;

   public MetodosFicheros(VentanaPrincipalobjVentana) {
      this.objVentana = objVentana;
   }

在调用上面的构造函数时传入适当的VentanaPrincipal,

private MetodosFicheros objMetodos = new MetodosFicheros(this);

并且不要创建任何新的VentanaPrincipal对象。