2015-02-23 61 views
0

我有一個很大的問題,我無法解決它我有JPanelJFrame。在這個面板中,我繪製了很多東西(如圖),但是當我滾動面板或調整框架大小時,圖畫就消失了!滾動或重新框架時,JPanel中的繪圖消失

我該如何讓繪圖留下來?

代碼:

private void full_simulation_button(java.awt.event.ActionEvent evt) { 

    if (jTextField1.getText().equals("")){ 
    JOptionPane jop2 = new JOptionPane(); 
    jop2.showMessageDialog(null, "You should enter you trace file !",   "Attention", JOptionPane.WARNING_MESSAGE); 
    } 
    else { 

    Graphics g = jPanel5.getGraphics(); 

g.setColor(Color.RED); 
g.drawRect(150,10,100,20); 
g.fillRect(150,10,100,20); 
g.drawLine(200,10 , 200, 2000); 
g.setColor(Color.BLACK); 
g.drawString("UE",190 ,25); 

g.setColor(Color.BLUE); 
g.drawRect(350,10,100,20); 
g.fillRect(350,10,100,20); 
g.drawLine(400,10 , 400, 2000); 
g.setColor(Color.BLACK); 
g.drawString("Node B",380 ,25); 

g.setColor(Color.GREEN); 
g.drawRect(550,10,100,20);  
g.fillRect(550,10,100,20); 
g.drawLine(600,10 , 600, 2000); 
g.setColor(Color.BLACK); 
g.drawString("RNC",590 ,25); 

g.setColor(Color.YELLOW); 
g.drawRect(750,10,100,20);  
g.fillRect(750,10,100,20); 
g.drawLine(800,10 , 800, 2000); 
g.setColor(Color.BLACK); 
g.drawString("CN",790 ,25); 

System.out.println(new java.io.File("").getAbsolutePath()); 
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
try { 
    final DocumentBuilder builder = factory.newDocumentBuilder();  
    final Document document= builder.parse(new File(jTextField1.getText())); 
    //Affiche la version de XML 
    System.out.println("la version du XML est "+ document.getXmlVersion()); 
    //Affiche l'encodage 
    System.out.println("l'encodage utilisé est"+document.getXmlEncoding()); 
    //Affiche s'il s'agit d'un document standalone  
    System.out.println("le document est standolone:"+document.getXmlStandalone()); 

    final Element racine = document.getDocumentElement(); 
    System.out.println("le racime du fichier est :"+racine.getNodeName()); 

    final NodeList racineNoeuds = racine.getChildNodes(); 

    final int nbRacineNoeuds = racineNoeuds.getLength(); 

    for (int i = 0; i<nbRacineNoeuds; i++) { 
      if(racineNoeuds.item(i).getNodeType() == Node.ELEMENT_NODE) { 
       final Element nd = (Element) racineNoeuds.item(i); 
       final Node noeud = racineNoeuds.item(i); 
       System.out.println(noeud.getNodeName()); 



    final NodeList msg = nd.getElementsByTagName("PARA"); 
    final int nbre = msg.getLength(); 
    int marge=0; 
    int rang =1; 
    String type =null; 
    String direction=null; 
    for(int j = 0; j<nbre ; j++){ 

     final Element message = (Element) msg.item(j); 


     g.setColor(Color.BLACK); 
     if (message.getAttribute("name").equals("Message Type")){ 
     type = message.getAttribute("value"); 
     // System.out.println(type); 
     if (type.startsWith("RRC")){ 

      g.drawLine(200,50+marge , 600, 50+marge); 
      g.drawString(rang+". "+type,220 ,45+marge); 
      marge=marge+30; 
      rang=rang+1; 
     } 
     if (type.startsWith("NBAP")){ 
      g.drawLine(400,50+marge , 600, 50+marge); 
      g.drawString(rang+". "+type,420 ,45+marge); 
      marge=marge+30; 
      rang=rang+1; 

     } 
     if (type.startsWith("RANAP")){ 
      g.drawLine(600,50+marge , 800, 50+marge); 
      g.drawString(rang+". "+type,620 ,45+marge); 
      marge=marge+30; 
      rang=rang+1; 

     } 
     } 
     if (message.getAttribute("name").equals("Message Direction")){ 
     direction = message.getAttribute("value"); 
     //System.out.println(direction); 
     if ((direction.equals("From-UE"))&&(type.startsWith("RRC"))){ 
      g.drawString(">",595, 50+marge-25); 
      System.out.println(type); 

     } 
     if ((direction.equals("To-UE"))&&(type.startsWith("RRC"))){ 
      g.drawString("<",200, 50+marge-25); 
      System.out.println(type); 

     } 
     if ((direction.equals("From-NodeB"))&&(type.startsWith("NBAP"))){ 
      g.drawString(">",595, 50+marge-25); 
      System.out.println(type); 

     } 
     if ((direction.equals("To-NodeB"))&&(type.startsWith("NBAP"))){ 
      g.drawString("<",400, 50+marge-25); 
      System.out.println(type); 

     } 
     if ((direction.equals("From-CN"))&&(type.startsWith("RANAP"))){ 
      g.drawString("<",600, 50+marge-25); 
      System.out.println(type); 

     } 
     if ((direction.equals("To-CN"))&&(type.startsWith("RANAP"))){ 
      g.drawString(">",795, 50+marge-25); 
      System.out.println(type); 

     } 
    } 

} 
     } 

} 

} 

     catch (final ParserConfigurationException e) { 
     e.printStackTrace(); 
      } 
     catch (final SAXException e) { 
      e.printStackTrace(); 
      } 
     catch (final IOException e) { 
     e.printStackTrace(); 
     } 
      } 
      }          
+0

'Graphics g = jPanel5.getGraphics(); 「這是問題的根源。組件應該在請求時繪製*請參閱本教程的[執行自定義繪畫](http://docs.oracle.com/javase/uiswing/painting/)課程以獲取正確的詳細信息做法。 – 2015-02-23 13:43:18

回答

2

你不應該畫的提供擺動功能外像paintComponent(Graphics g)。調整大小或滾動組件時將被重新繪製。在這個過程中,調用每個涉及組件的paintComponent方法。由於您的繪圖發生在其外部,面板不會按預期重新繪製。覆蓋paintComponent方法並將所有繪圖代碼複製到其中。

class MyPanel extends JPanel 
{ 
    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.setColor(Color.RED); 
     g.drawRect(150,10,100,20); 
     g.fillRect(150,10,100,20); 
     g.drawLine(200,10 , 200, 2000); 
     g.setColor(Color.BLACK); 
     g.drawString("UE",190 ,25); 
     /* ... All drawing code ... */ 
    } 
} 
+0

請告訴我在哪兒添加此代碼(類MyPanel擴展JPanel { @覆蓋 保護無效paintComponent(圖形G) { super.paintComponent方法(G);這是我第一次與Java – jiji 2015-02-23 14:02:01

+1

放入到developp在'full_simulation_button'方法中調用'jPanel5.repaint()'.. – 2015-02-23 14:03:43

+0

現在我沒有任何結果:( – jiji 2015-02-23 15:13:40

0

每次調整組件大小或將它移動到滾動窗格中時,都會重繪。這是Swing工作的方式。如果你希望你的面板能夠重新繪製它的內容,它必須知道它。 在這種情況下,您應該創建一個新的類來擴展JComponent類並覆蓋paintComponent(Graphics)方法。這是負責繪製圖表的方法。

public class Drawer extends JComponent { 

    private File source; 

    public void setSource(File source) { 
     this.source = source; 
     repaint(); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     if (source == null) { 
      return; 
     } 
     g.setColor(Color.RED); 
     g.drawRect(150, 10, 100, 20); 
     g.fillRect(150, 10, 100, 20); 
     g.drawLine(200, 10, 200, 2000); 
     g.setColor(Color.BLACK); 
     g.drawString("UE", 190, 25); 

     g.setColor(Color.BLUE); 
     g.drawRect(350, 10, 100, 20); 
     g.fillRect(350, 10, 100, 20); 
     g.drawLine(400, 10, 400, 2000); 
     g.setColor(Color.BLACK); 
     g.drawString("Node B", 380, 25); 

     g.setColor(Color.GREEN); 
     g.drawRect(550, 10, 100, 20); 
     g.fillRect(550, 10, 100, 20); 
     g.drawLine(600, 10, 600, 2000); 
     g.setColor(Color.BLACK); 
     g.drawString("RNC", 590, 25); 

     g.setColor(Color.YELLOW); 
     g.drawRect(750, 10, 100, 20); 
     g.fillRect(750, 10, 100, 20); 
     g.drawLine(800, 10, 800, 2000); 
     g.setColor(Color.BLACK); 
     g.drawString("CN", 790, 25); 

     System.out.println(new java.io.File("").getAbsolutePath()); 
     final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 

     try { 
      final DocumentBuilder builder = factory.newDocumentBuilder(); 
      final Document document = builder.parse(source); 


     } catch (final ParserConfigurationException e) { 
      e.printStackTrace(); 
     } catch (final SAXException e) { 
      e.printStackTrace(); 
     } catch (final IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

由抽屜類的實例替換您的JPanel並更換監聽器方法由內容:

private void full_simulation_button(java.awt.event.ActionEvent evt) {           

    if (jTextField1.getText().isEmpty()) { 
     JOptionPane.showMessageDialog(null, "You should enter you trace file !", "Attention", JOptionPane.WARNING_MESSAGE); 
    } else { 
     drawer.setSource(new File(jTextField1.getText())); 
    } 
} 

當用戶點擊該按鈕,文件被創建,並給出了Drawer的來源。 Drawer重繪本身,paintComponent()方法由Swing的內部機制調用。

現在你應該嘗試通過每個paintComponent()方法被調用時不能解析XML文件來提高代碼(您解析它在setSource(),然後你在paintComponent()使用數據)。

+0

'final Document document = builder.parse(source);'這不是應該在任何'paint ..(Graphics)'方法中的(可能長時間運行的)任務的類型。當然不是每次都調用這個方法!相反,你可以將'final document document'聲明爲(非final)類屬性,並在'setSource'方法中解析(儘管這可能在邏輯上將方法的名稱更改爲..'parseSource?)。 – 2015-02-23 14:07:43

+0

這就是我在帖子結尾處解釋的內容。他應該改進這個類,以避免在每次調用時解析文件。但是讀完最後一句話,我看不清楚。我改變它更加精確。 – osechet 2015-02-23 14:11:36

+0

這個問題是我的圖畫是對文件的解析進行推理我不能把它們分開:( – jiji 2015-02-23 14:45:11