2016-11-10 1 views
0

JComponents을 서로 위에 겹쳐서 (오버랩) 동시에 개별적으로 액세스하고 변경할 수있는 방법을 찾고 있습니다.JFrame에서 독립적 인 JPanel-Layers를 만들고 개별적으로 다시 칠하는 방법

예. 투명 배경을 가진 세 개의 JPanels 페인트 - 각각은 원, 직사각형 또는 선을 포함합니다. 그런 다음 원의 모양을 변경하고 싶습니다. 나머지 두 개는 다시 그리지 않아야합니다 (Photoshop의 레이어와 비슷 함).

내 현재 프로젝트는 수천 줄의 수를 가진 Jpanel이며 매우 늦을 때마다 Jpanel을 다시 그리면 마우스 오버시 다시 사각형을 변경해야합니다.

이를 수행하기위한 적절한 방법이 있습니까? 이미 당신의 아이디어에 감사드립니다!

+0

좋은 방법은 하나의 JPanel과 여러 개의 BufferedImages를 레이어로 사용하는 것입니다. 투명 영역을 페인트하지 않도록 각 BufferedImage를 순서대로 페인트합니다. 애니메이션의 각 프레임에 대해 전체 그리기 영역을 지우고 다시 칠해야합니다. 또한 드로잉 패널 paintComponent 메소드는 페인트 만하면됩니다. 계산이 없습니다. Graphics2D 이외의 방법은 없습니다. 마지막 대안은 기하학적 인물을 모델링하고 모델에서 인물을 그리는 것입니다. –

+0

그림을 설정하는 방법을 보려면 내 [움직이는 눈] (http://stackoverflow.com/questions/34981403/bufferedimage-not-being-cleared-before-each-rendering/35002727#35002727) 답변을 확인하십시오. 스윙의 패널. –

+0

그건 내 문제를 해결할 수있을 것 같은데! 레이어로서의 BufferedImages - 나는 그것을 시도 할 것이다! 고맙습니다! –

답변

0

나는 당신이 호출 할 수 있습니다 뒷면

에 사각형을 변경해야

panel.repaint(rectangle); // or 
panel.repaint(x, y, width, height); 

는 사각형 영역을 다시 칠을 지정할 수 있습니다.

+0

빠른 답변 주셔서 감사합니다. 그러나 제 시나리오에서 모든 jpanel은 서로 위에 놓여 있습니다 - 그래서 그들은 동일한 테두리 상자를가집니다. 나는. 직사각형을 다시 칠하면 다른 모든 레이어가 완전히 다시 칠해집니다. 기본적으로 사각형은 배경과 동일합니다. –

+0

맞습니다. 스윙은 재 페인트 할 구성 요소를 살펴보고 불투명 한 배경을 가진 구성 요소를 찾을 때까지 모든 부모를 봅니다. 그런 다음 배경 및 모든 하위 구성 요소를 해당 위치에 칠합니다. 이것은 영역에 인공물이 전혀 없음을 확인하는 것입니다. 내 제안은 전체 패널의 사각형을 페인트하는 것이 아니라 변경된 패널의 서브 세트만을 페인트하는 것이 었습니다. 따라서 원을 변경하면 원에 완전히 포함 된 영역 만 다시 칠합니다. – camickr

+0

@MatthiasK, 원과 사각형을 다시 그린 패널은 문제가되지 않습니다. 한 번에 수백 개의 물건을 문제없이 칠했습니다. 다른 그림 문제가 있어야합니다. – camickr

0

꽤 괜찮 았는데 - 다른 사람이 비슷한 문제가 있다면 여기 내 코드가 있습니다! 첫 번째 이미지는 나중에 저장하고 표시 할 수 있습니다. (버프) 투명도가 사라지면 다시 표시 할 때 새 BufferedImage (여기 캔버스)를 생성하십시오. Gilbert Le Blanc에게 감사드립니다.

@Override 
protected void paintComponent(Graphics g1) { 
    //Create image: 
    BufferedImage buff = new BufferedImage(mywidth, myheight, BufferedImage.TYPE_INT_ARGB); 

    //write to image: 
    Graphics2D g2 = (Graphics2D) buff.getGraphics(); 
    g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,(float) 0.01f)); 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2.draw(xxxRectanglewhatever); 

    //then - later draw image again 
    BufferedImage canvas = new BufferedImage(mywidth, myheight, BufferedImage.TYPE_INT_ARGB); 
    canvas.getGraphics().drawImage(buff, 0, 0, null); 
    ((Graphics2D) g1).setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 
    g1.drawImage(canvas, 0, 0, null); 
    canvas.flush(); 
} 
관련 문제