我们的编译原理实践作业,要求自动根据语法生成一棵语法树。我已经实现了,问题是要怎么才能在有限的画面上摆下一棵巨大的语法树。我采用了JScrollPane,并且设置了JPanel的setPreferredSize,的确扩大了画板空间,但是在我移动滚条时,出现的是按照边缘的像素不断延伸,而不是我想要的按照paintComponent()里面所设置的那样画。拜托各位大虾,这是什么原因啊??应该如何改正?
错误如下:

解决方案 »

  1.   

    猜测一下,是不是在拖动滚动条的时候没有repaint
      

  2.   

    我在JScrollPane中加了的,在mouseDrag事件中
      

  3.   

    final JPanel panel = new JPanel(){
    void drawBranch(GrammarAnalyzer.Node n,int level,Graphics g){
    for (GrammarAnalyzer.Node child : n.siblingNodes) {
    child.setNodeY(level*FLOOR);
    g.drawString(child.sym.toString(), child.x, child.y+DOWN);
    g.drawLine(n.x, n.y+SET_OFF+DOWN, child.x, child.y-SET_OFF+DOWN);
    drawBranch(child,level+1, g);
    }
    }
    public void paintComponent(Graphics g){
    if (parser.grammarTree!=null) {
    int level=0;
    GrammarAnalyzer.Node root=parser.grammarTree.root;
    g.drawString(root.sym.toString(), root.x, root.y+DOWN);
    drawBranch(root,level+1, g);
    //parser.grammarTree=null;
    }
    }
    };
    panel.addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseDragged(final MouseEvent arg0) {
    repaint();
    }
    });
    panel.setPreferredSize(new Dimension(3000, 2000));
    panel.revalidate();
    //panel.setAutoscrolls(true);
    //panel.setBorder(new TitledBorder(null, "Grammar Tree", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
    panel.setBounds(341, 61, 3000, 2000);
    getContentPane().add(panel);
    final JScrollPane scrollPane = new JScrollPane();
    //scrollPane.setPreferredSize(new Dimension(3000, 2000));
    scrollPane.setBorder(new TitledBorder(null, "Grammar Tree", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
    scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
    scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    scrollPane.setViewportView(panel);
    scrollPane.setBounds(357, 58, 589, 579);
    getContentPane().add(scrollPane);
      

  4.   

    创建一张图片,图片上是你要现实的内容,然后再drawImage就可以了