2014-03-04 41 views
1

我正在嘗試使用JScrollPane來處理我正在處理的項目,並且發現了一個問題。當第一次調用帶有繪圖的框架時,內部的圖紙看起來很好。但是,當我使用滾動條滾動時,圖紙彼此「重疊」並且弄亂了整個事物。現在我認爲這是因爲我的項目很複雜,所以我試圖以一種更簡單的方式來做到這一點。我結束了同樣的結果。我附:l,瞬間就變成了錯誤代碼(簡版),以及圖片:JScrollbar中的paintComponent

JPanel類的,我在那裏做繪圖:

entepublic class PaintThis extends JPanel { 

public PaintThis() 
{ 
    setBorder(new LineBorder(Color.RED)); 
    setPreferredSize(new Dimension(1000, 1000)); 
} 



public void paintComponent(Graphics graphics) 
{ 
    graphics.setColor(Color.RED); 
graphics.fillOval(0, 0, 30, 30); 
graphics.drawOval(0, 50, 30, 30);  
graphics.fillRect(50, 0, 30, 30); 
graphics.drawRect(50, 50, 30, 30); 

} } 

,我繪製框架類:

public class CreatePanel { 

public CreatePanel() 
{ 
    JFrame frame = new JFrame("Test"); 
    JScrollPane scroll = new JScrollPane(new PaintThis()); 
    frame.setSize(300, 300); 
    frame.setVisible(true); 
    frame.add(scroll); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} } 

而就在主文件:

public class theTest { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    // TODO code application logic here 
    CreatePanel panel = new CreatePanel(); 
}} 

現在這些是R圖像esult:

初始圖像(當我啓動程序)

InitialImage

當我滾動

enter image description here

當我回到原來的位置

enter image description here

非常感謝您爲您提供的任何幫助。我在這裏呆了近一個星期,我真的試圖自己尋找解決方案。

再次感謝!

回答

4

您需要在覆蓋中調用super的方法:super.paintComponent(g);。這將允許JPanel做家務管理,包括清除以前的圖像。

@Override 
proteced void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(Color.RED); 
    g.fillOval(0, 0, 30, 30); 
    g.drawOval(0, 50, 30, 30);  
    g.fillRect(50, 0, 30, 30); 
    g.drawRect(50, 50, 30, 30); 
} 
+0

@peeskillet:對不起。並感謝提醒我有關保護。 '@覆蓋'也是。 –

+0

非常感謝!我沒有意識到這是它的重要組成部分。一週的代碼看,一行代碼。我真是個白癡。再次感謝! –

+0

@PaoloPapa:你不是白癡,因爲圖形程序沒有什麼直覺(至少對我來說),所以它需要學習新的規則。祝你好運! –

2

此外frame.setVisible(真)應後frame.add(滾動);

frame.add(scroll); 
frame.setVisible(true); 

另外調用JPanel Intialization中的超級構造函數。

public PaintThis() 
{ 
    super(); 
    setBorder(new LineBorder(Color.RED)); 
    setPreferredSize(new Dimension(1000, 1000)); 
} 
+1

@peeskillet:他的回答似乎是除了我的。 1+這個答案的好建議。 –

+0

@peeskillet同意。這些只是我想添加到代碼中的其他建議。 –