我想创建一个用指定行数读取的文件的预览。我的代码运行正常,问题是如果我选择其他行数,JDesktopPane不会刷新,它会覆盖前面的行。
我的代码如下所示:
previewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
try {
if(Integer.parseInt(nrLines.getText()) < 20) {
for(int i=0; i< Integer.parseInt(nrLines.getText());i++){
previewLabel[i] = new JLabel(" ");
previewLabel[i].setText("Line nr. "+(i+1)+": "+previewList.get(i));
previewLabel[i].setBounds(20,575+25*i,700,300);
previewLabel[i].setVisible(true);
desktopPane.add(previewLabel[i]);
}
desktopPane.repaint();
}
else {
System.out.println("Maximim number of lines is 20 !");
}
} catch (Exception e) {
System.out.println("Please enter a integer value !");
}
}
});
desktopPane.add(previewButton);
以下是我选择其他行数的方式:
提前感谢您的帮助!
答案 0 :(得分:1)
查看您的代码,似乎每次调用actionPerformed()
时,您都会向previewLabel
添加新的desktopPane
。您可以尝试跟踪您添加的内容(或检查desktopPane
的子项),并在添加新标签之前删除旧标签。
或者,也许您可以替换旧标签的内容,而不是创建新标签。
示例(我没有使用过您的代码,但它显示了我正在考虑的两种方法):
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
class Test {
static JLabel labelToReplace;
static JLabel labelToUpdate;
private static JLabel newLabel(String s) {
JLabel l = new JLabel(s);
l.setBounds(30, 160, 200, 40);
labelToReplace = l;
return l;
}
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
frame.setSize(300, 300);
JDesktopPane desktopPane = new JDesktopPane();
frame.setContentPane(desktopPane);
// This one we will update.
labelToUpdate = new JLabel("Test label");
labelToUpdate.setBounds(30, 120, 200, 40);
desktopPane.add(labelToUpdate);
// This one we will replace.
desktopPane.add(newLabel("Another"));
JButton btnRefresh = new JButton("Refresh");
btnRefresh.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
labelToUpdate.setText(new Date().toString());
desktopPane.remove(desktopPane.getIndexOf(labelToReplace));
desktopPane.add(newLabel(new Date().toString()));
}
}
);
btnRefresh.setBounds(30, 50, 100, 70);
desktopPane.add(btnRefresh);
frame.show();
}
}