2010-02-02 4 views
0

Java JRE 1.6.7을 사용하고 JComponent와 JScrollPane이 있습니다. 이중 버퍼링을 사용하여이 작업을 수행 할 수 없어 항상 깜박임이 발생했습니다. Canvas를 사용하면 버퍼링이 처리되었지만 JScrollPane과 함께 사용하면 문제가 발생합니다.JScrollPane 안쪽에 사용자 지정 그리기되지 않은 컴포넌트

따라서 JRE 1.6.18을 다운로드하여 이러한 문제 중 하나가 수정되기를 바랍니다. 자, JScrollPane 내의 JComponent가 올바르게 paint되지 않습니다. JScrollPane가 경계를 제외 해 그 위로 그려지고있는 것처럼, JComponent의 외부 영역만을 드로잉 (Drawing)합니다.

public void paint(Graphics arg0) { 



Graphics2D graphics = (Graphics2D) arg0; 

    graphics.setColor(Color.WHITE); 
    graphics.fillRect(0, 0, (int) getWidth(), (int) getHeight()); 

어떤 도움을 크게 받고있다 :

여기 도면이 발생하는 영역의 1 픽셀 너비의 백색 윤곽의 결과 drawing..this되지 않는 코드의 예이다! -Craig

답변

2

paint(Graphics g) 대신 paintComponent(Graphics g)에서 재정의를 시도하십시오. paintComponent는 costum 그리기를 위해 재정의해야하는 메소드입니다.

흰색 직사각형을 볼 수 있는지, 빨간색을 사용하려고했는지 또는 잘 보일 수있는 다른 것이 있는지 확인하십시오.

+0

안녕하세요 감사합니다. 예, 윤곽선이 분명히 있습니다. 나는 레드에서도 그것을 시도했다. 나는 또한 paintComponent에 내 페인트 코드를 넣으려고했지만 같은 결과를 얻었습니다. 그림 JComponent를 JDialog의 가운데에 직접 추가하여 완벽하게 그립니다. 그러나, 그것을 JScrollPane에 추가하고 JDialog에 추가하자마자 이상한 드로잉 동작을 시작합니다. 다음은 dialog/scrollpane에 추가 할 코드입니다. – Craig

+0

JScrollPane scrollPane = new JScrollPane(); scrollPane.add (containerCanvas); scrollPane.setSize (containerCanvas.getSize()); dialog.add (scrollPane, BorderLayout.CENTER); dialog.setVisible (true); – Craig

1

좋아, 나는 약간의 대답을 내놓았다. 대신

scrollPane.add(containerCanvas); 

를 호출 나는 이것은 어떤 의미에서 작동

new JScrollPane(containerCanvas); 

를 호출하고 있습니다. 그러나, 이제 JScrollPane 막대가 나타나지 않도록하고 있습니다. 나는 이것이 왜 있는지 전혀 모르지만, 현재 그것에 대해 조사 중이다. 그러나 적어도 구성 요소는 다시 그려집니다.

+0

스크롤 할 수있는 구성 요소에서 수행하고있는 getSize가 아니라 단지 PREFERRED 크기를 가져 오려면. 구성 요소로 스크롤 창을 인스턴스화 할 수없는 경우 scrollPane.getViewport.add (구성 요소)를 호출 할 수도 있습니다. 그것은 똑같은 일을합니다. 이 문제를 보았던 모든 분들께 감사드립니다. – Craig

2

진행중인 것처럼 보이지만, tutorial examples을보고 싶을 수도 있습니다.

Martijn Courteaux의 분석이 정확합니다. paintComponent()을 무시해야합니다. 또한 AWT와 Swing 구성 요소를 혼합하는 것은 좋지 않습니다. 두 가지 아이디어는 Painting in AWT and Swing에서 논의됩니다.

스크롤링으로 인해 깜박 거리지 않아야합니다. 다음은 구성 요소 격자를 스크롤하고 배경에 바둑판을 그립니다 예제입니다.

import java.awt.*; 
import javax.swing.*; 

public class Scrolling extends JFrame { 

    private static final int MAX = 8; 
    private static final int SIZE = 480; 
    private static final Color light = new Color(0x40C040); 
    private static final Color dark = new Color(0x408040); 

    private static class MyPanel extends JPanel { 

     public MyPanel() { 
      super(true); 
      this.setLayout(new GridLayout(MAX, MAX, MAX, MAX)); 
      this.setPreferredSize(new Dimension(SIZE, SIZE)); 
      for (int i = 0; i < MAX * MAX; i++) { 
       this.add(new JLabel(String.valueOf(i), JLabel.HORIZONTAL)); 
      } 
     } 

     @Override 
     public void paintComponent(final Graphics g) { 
      int w = this.getWidth()/MAX; 
      int h = this.getHeight()/MAX; 
      for (int row = 0; row < MAX; row++) { 
       for (int col = 0; col < MAX; col++) { 
        g.setColor((row + col) % 2 == 0 ? light : dark); 
        g.fillRect(col * w, row * h, w, h); 
       } 
      } 
     } 
    } 

    public Scrolling() { 

     this.setLayout(new BorderLayout()); 
     final MyPanel panel = new MyPanel(); 
     final JScrollPane scrollPane = new JScrollPane(panel); 
     scrollPane.getHorizontalScrollBar().setUnitIncrement(16); 
     scrollPane.getVerticalScrollBar().setUnitIncrement(16); 
     this.add(scrollPane, BorderLayout.CENTER); 
     this.pack(); 
     this.setSize(SIZE - SIZE/3, SIZE - SIZE/3); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setLocationRelativeTo(null); 
    } 

    public static void main(final String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new Scrolling().setVisible(true); 
      } 
     }); 
    } 
} 
+0

['setPreferredSize()'] (http://stackoverflow.com/q/7229226/230513) 데모 용으로 만 사용됩니다. – trashgod