2014-09-25 2 views
0

현재 (Jlabel과 함께) 이미지를 JEditorPane에 표시하려고합니다. Swixml 및 양식 레이아웃 작업, JLabel 및 JEditorPane 같은 위치에 배치했습니다. 그래서 간단히 "setVisible"을 또는 으로 설정하여 이미지가 나타나게합니다.Z 정렬 및 중첩 (JLabel 및 JEditorPane)

지금까지 모두 훌륭합니다. 누군가가 여기에 JEditorPane의 텍스트를 선택합니다 추한 것은 시도 할 때 '선택이 경우에도

효과 없음 :

  1. 해제하는 JEditorPane : Bug illustration

    을 나는 몇 가지 시도 nt 표시, 텍스트 JLabel에 나타납니다.

  2. 는 다시 그리기 :

    내가 JLabel의를 칠 때, 앞으로 밀어 다시,하지만 난 repeateadly을 할 필요는 (같은 한 번 50ms마다)은 그렇지 않은 볼 수 있도록하기 위해;

    또한 선택에 다시 칠하려고 노력하지만, 일부의 경우 그냥 무시됩니다 잘 일을 해달라고하거나 느리게하고 여전히 추한

  3. 마지막 생각이 JLabel의이 디스플레이 어이 때의 JEditorPane에 입력 마우스를 방지하는 것이 었습니다 하지만 ... MouseEnter 이벤트가 EditorPane에서 요점을 파악하는 저를 ALOW하지 않는, 그래서 JEditorPane의에서, 좋은 장소에 커서를 넣어 하드되었다

나는 setComponentZOrder을 시도,하지만 난이었다 그것을 잘 작동하게 만들 수는 없다. (필자는 그것을 오용했다.) 그러나 그림의 순서 만 바꾸기 때문에 내 문제를 해결할 수 없다고 생각한다. 마지막으로 페인트가 Java로 맨 위에 있습니다.)하지만 분명히 다시 칠하는 문제입니다.

Java 1.6 (Java 1.7 및 1.8에서 사용해야하는 동일한 이름의 클래스와의 충돌, 1.9에서 수정 된 사항에 대한 Sun의 변경 로그 대화 ...)을 사용해야한다는 점을 지적하는 것이 유용 할 것입니다.

컨텍스트는 애플릿이므로 이해할 수없는 경우 (영어는 모국어가 아님) 주저하지 말고 저를 고치고 저에게 묻습니다.

도와 주셔서 감사합니다.

+0

NB : 자바가 싫어 - 일반적으로 나도 위스키가 너무 좋아. – mKorbel

답변

2

DefaultHighlighter를 살펴 보겠습니다.JEditorPane로 당신은 모든 하이라이트를 페인트 볼 수 있듯이이 방법을

public void paint(Graphics g) { 
    // PENDING(prinz) - should cull ranges not visible 
    int len = highlights.size(); 
    for (int i = 0; i < len; i++) { 
     HighlightInfo info = highlights.elementAt(i); 
     if (!(info instanceof LayeredHighlightInfo)) { 
      // Avoid allocing unless we need it. 
      Rectangle a = component.getBounds(); 
      Insets insets = component.getInsets(); 
      a.x = insets.left; 
      a.y = insets.top; 
      a.width -= insets.left + insets.right; 
      a.height -= insets.top + insets.bottom; 
      for (; i < len; i++) { 
       info = highlights.elementAt(i); 
       if (!(info instanceof LayeredHighlightInfo)) { 
        Highlighter.HighlightPainter p = info.getPainter(); 
        p.paint(g, info.getStartOffset(), info.getEndOffset(), 
          a, component); 
       } 
      } 
     } 
    } 
} 

을 가지고 selecton (하이라이트)를 렌더링하는 데 사용합니다.

JEditorPane의 강조 표시기 (DefaultHighlighter 인스턴스)를 사용자의 확장자로 바꿀 수 있습니다. paint() 메서드를 재정의하고 사용자 정의 클립을 Graphics 인스턴스에 추가합니다. 클립에는 JLabel 사각형을 뺀 현재 클립을 기반으로 사용자 정의 모양이 있어야합니다.

+0

아주 좋은 생각입니다. 이미지가 있어야 할 때 DefaultHightlighter를 확장하고 그래픽을 그립니다. 표시됩니다. 거의 작동하지만 텍스트와 선택 항목은 더 이상 볼 수 없습니다. 그러나 나는 여전히 흰색 배경을 가지고 있습니다. 나는 무언가를 그리워하고, 이미지 작업을 다시 칠하는 것이 그리울 지 모르지만 여전히 추악합니다. 어쨌든, 고마워요! –

+0

JEditorPane의 paintComponent()에 동일한 클립 로직을 추가하려고 시도하십시오. – StanislavL

+0

paintComponent를 클리핑하면 모든 것이 버그가됩니다 ^^ 이미지가 나타나면 작동하지만 일부 텍스트를 강조 표시하면 completly mess ^^ 다시 칠해도 충분합니다.) 감사 –

0

Overlap Layout을 만들려고했습니다. 나는 회화 문제를주의했다. 마우스 이벤트에 응답하는 구성 요소가 포함되어 있습니다.

는 마지막 단락에서 나는 말했다 :

내가 JButton의를 사용하는 경우, 마우스 입력 이벤트는 각 구성 요소의 혼란 렌더링 결과 상단 다른 버튼에 그려진되는 중복 버튼을 야기한다는 통지를했다. 이 문제가 발생하면 해결 방법은 JPanel의 isOptimizedDrawingEnabled() 메서드를 재정 의하여 false을 반환하는 것입니다. 이렇게하면 칠하기 문제가 제대로 해결 될 수 있도록 구성 요소가 겹쳐서 표시되는 다시 그리기 하위 시스템에 알립니다.

어쩌면 이것은 또한 귀하의 경우에 도움이 될 것입니다.

+0

^^하지만 제안에 감사드립니다. –