繁体   English   中英

Java-JPanel-使用arraylist绘制文本文件的内容-仅在第一次使用

[英]Java - JPanel - painting contents of a text file with an arraylist - Only works the first time

我有一个带有JMenuBar的程序。 在JMenuBar的内部有一个JButton,该JButton会打开一个具有2个JMenuItems的JMenu。 当您单击其中一个项目时,它将打开另一个JFrame,并逐行打印文本文件的内容。

如果您选择另一个选项(在同一会话中),则它应该更改JFrame标题(此方法有效),并打印另一个文本文件的内容(此方法无效)。

我已经查明了问题所在,但是我不知道为什么会发生此问题。 发生的事情是该代码在第一次显示文本文件的内容时完美地工作了。 但是,第二次它不会更改文本。

评论中介绍了我第二次发现的内容。 从setDocument方法开始,然后移至paintComponent方法。

这是有问题的类(该程序还有其他几个类,但问题仅在该类之内)...

package PeriodicTable;

import javax.swing.JPanel;

import java.util.ArrayList;

import java.io.IOException;
import java.io.FileReader;
import java.io.BufferedReader;

import java.awt.Graphics;
import java.awt.Color;

import java.lang.Override;

class DocumentPanel extends JPanel {
private ArrayList<String> aryDocument;
DocumentPanel(){
    super();
    setBackground(Color.white);
}
@Override
protected void paintComponent(Graphics gr){
    super.paintComponent(gr);
    //aryDocument holds the contents of the old text file (should have the contents of the other text file)
    for(int index = 0; index < aryDocument.size(); index++){
        //enters loop, re-prints the old document
        gr.drawString(aryDocument.get(index), 5, (index + 1)*10);
    }
}
public void setDocument(String strFileDirectory){ //places contents of text file in an array (line by line)

    //aryDocument is null at this time
    aryDocument = new ArrayList<String>();
    //aryDocument is empty at this time
    try(BufferedReader reader = new BufferedReader(new FileReader(strFileDirectory))){
        for(String strLine; (strLine = reader.readLine()) != null; ){
            aryDocument.add(strLine);
        }
        reader.close();
    }catch(IOException ioe){
        ioe.printStackTrace();
    }
    //aryDocument holds the contents of the other text file
    this.revalidate();
}
}

以下方法位于名为Table的类中(Table实现ActionListener)。 此方法由actionPerformed调用,后者使用ActionCommand值来确定什么动作可以做什么。

private void loadTextFile(String strName, String strFileDirectory){
    DocumentPanel clsDocumentPanel = new DocumentPanel();
    if(frmDocument == null){
        frmDocument = new JFrame(strName);
        frmDocument.setPreferredSize(new Dimension(600, 700));
        clsDocumentPanel.setDocument(strFileDirectory);
        frmDocument.add(clsDocumentPanel);
        frmDocument.pack();
        frmDocument.setVisible(true);
    }else{
        if(!(frmDocument.getTitle().equals(strName))){
            frmDocument.setTitle(strName);
            clsDocumentPanel.setDocument(strFileDirectory);
            frmDocument.pack();
            frmDocument.setVisible(true);
        }
    }
}

我已经重新检查了strFileDirectory并确认它们是正确的值。

我正在使用什么版本/程序/等?

Java 8

记事本

命令提示符

我的问题明确指出...

为什么aryDocument的值进入paintComponent时(加载另一个文本文件之后)不改变? 我该如何解决?

这里,

DocumentPanel clsDocumentPanel = new DocumentPanel(); // <- yes, here!
if(frmDocument == null){
    frmDocument = new JFrame(strName);
    frmDocument.setPreferredSize(new Dimension(600, 700));
    clsDocumentPanel.setDocument(strFileDirectory);
    frmDocument.add(clsDocumentPanel);
    frmDocument.pack();
    frmDocument.setVisible(true);
}else{
    if(!(frmDocument.getTitle().equals(strName))){
        frmDocument.setTitle(strName);
        clsDocumentPanel.setDocument(strFileDirectory);
        frmDocument.pack();
        frmDocument.setVisible(true);
    }
}

您每次执行操作时都会创建一个新的DocumentPanel实例。 第一次将其添加到frmDocument 第二次,您只需对其调用setDocument并对其进行垃圾回收。 第一个实例(实际上附加到显示的框架)永远不会更新。

所以,要么

  • 店内clsDocumentPanel地方分开,就像您存储frmDocument而不是作为一个局部变量;
  • frmDocumentJFrame子类,该子类公开对其文档面板的访问权,并调用frmDocument.getDocumentPanel().setDocument(...) -但这违反了frmDocument.getDocumentPanel().setDocument(...)定律;
  • 或将frmDocument具有setDocument方法的JFrame子类,该方法仅委托其面板的setDocument ,然后只需调用frmDocument.setDocument(...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM