[英]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
, 而不是作为一个局部变量; frmDocument
为JFrame
子类,该子类公开对其文档面板的访问权,并调用frmDocument.getDocumentPanel().setDocument(...)
-但这违反了frmDocument.getDocumentPanel().setDocument(...)
定律; frmDocument
具有setDocument
方法的JFrame
子类,该方法仅委托其面板的setDocument
,然后只需调用frmDocument.setDocument(...)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.