2016-01-11 33 views
1

我想用指定的行数创建一个我读取的文件预览。我的代码工作正常,问题是,如果我选择另一行数,JDesktopPane不刷新,它覆盖以前的行。刷新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);   

这里是如何看我选线的另一号码后:

enter image description here

预先感谢帮助!

回答

1

看着你的代码,似乎每次调用actionPerformed()时,都会向desktopPane添加新的previewLabel。您可以尝试跟踪您添加的内容(或者检查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(); 
    } 
} 
+0

谢谢您的回答。你能以一种方式帮助我,我怎样才能用新的方法去除或替换旧的?我尝试了我所知道的一切.. – DCalin

+0

添加了一些示例代码 – Vlad

+0

非常感谢!我真的被吓到了。我知道我做错了什么,但不知道如何解决它。再次感谢 – DCalin