继承JComponent写了一个类canvas,放在JScrollPane里面,但是用setPreferredSize调整canvas的大小之后,JScrollPane的大小没有变化,调用canvas.getParent().repaint()也没有用,只有当整个窗口的大小变化时滚动条的大小才会刷新,请问应该如何刷新JScrollPane的滚动条?

解决方案 »

  1.   

    谢谢楼上诸位,大概就是这个意思:
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;import javax.swing.*;public class JMyWidget extends JComponent {
    Rectangle rect;

    public JMyWidget(){
    rect = new Rectangle(0, 0, 100, 100);
    this.addMouseListener(new MouseAdapter(){
    public void mouseClicked(MouseEvent e){
    rect.width += 10;
    rect.height += 10;
    JMyWidget.this.setPreferredSize(new Dimension(rect.width, rect.height));
    JMyWidget.this.getParent().repaint();//JMyWidget自己重绘了,但是滚动条拽一下窗口才出现……
    //如何让JScrollPane知道滚动条需要重画?
    }
    });
    }

    public void paintComponent(Graphics g){
    g.fillRect(rect.x, rect.y, rect.width, rect.height);
    }

    public static void main(String[] args){
    JFrame frame = new JFrame();
    JScrollPane pane = new JScrollPane();
    JMyWidget myw = new JMyWidget();
    pane.setViewportView(myw);
    frame.add(pane);
    frame.setSize(200, 150);
    frame.setVisible(true);
    }
    }
      

  2.   


    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;import javax.swing.*;public class JMyWidget extends JComponent {
        Rectangle rect;
        static JScrollPane pane = new JScrollPane();
        
        public JMyWidget(){
            rect = new Rectangle(0, 0, 100, 100);
            this.addMouseListener(new MouseAdapter(){
                public void mouseClicked(MouseEvent e){
                    rect.width += 10;
                    rect.height += 10;
                    JMyWidget.this.setPreferredSize(new Dimension(rect.width, rect.height));
                    pane.setViewportView(JMyWidget.this);
                    JMyWidget.this.getParent().repaint();//JMyWidget自己重绘了,但是滚动条拽一下窗口才出现……
                    //如何让JScrollPane知道滚动条需要重画?
     
                }
            });
        }
        public void paintComponent(Graphics g){
            g.fillRect(rect.x, rect.y, rect.width, rect.height);
        }
        
        public static void main(String[] args){
            JFrame frame = new JFrame();
            JMyWidget myw = new JMyWidget();
            pane.setViewportView(myw);
            frame.add(pane);
            frame.setSize(200, 150);
            frame.setVisible(true);
        }
    }
      

  3.   

    在事件中用pane添加组件。搞定。
      

  4.   

    设置过perferredSize之后,调用一下validate或者revalidate方法。不然不会立即更新。