2010-01-13 3 views
0

일부 정보를 표시하는 AWT 캔버스 (타사 라이브러리)가 있습니다. 그 위에 스크롤 창을 표시해야합니다. 캔버스는 AWT이므로 JScrollPane 대신 ScrollPane을 사용해야합니다. scrollpane에 둥근 테두리를주고 싶습니다. AWT에서는 가능합니다. 또는 캔버스 상단에 JScrollPane을 사용할 수있는 방법이 있습니다. 자바의 최신 버전이 경량/중량 구성 요소를 더 잘 혼합 할 수 있다고 생각하지만 옵션이 아닌 것으로 가정합시다.AWT ScrollPane 사용자 정의

감사합니다, 제프

+0

당신은 귀하의 의견 중 하나에 팝업을 언급 한이 - 당신이 추가 정보를 제공 할 수 있습니까? 팝업 메뉴? JPopupMenu? Popup/PopupFactory? – Nate

+0

내 응용 프로그램에서 디스플레이의 항목을 클릭 할 수 있습니다. 항목을 클릭하면 정보가 팝업됩니다. 많은 정보가있을 수 있으므로 스크롤 창에 넣고 싶습니다. 클릭 한 항목은 3D 캔버스에 있어야하므로 항목에 대한 스크롤 가능한 텍스트를 표시하려고합니다. 이상적으로 나는 "둥근"효과를주기 위해 팝업 테두리를 사용자 정의하고 싶습니다. –

+0

글쎄, 당신이 원하는 것을 설명했다 -하지만 어떤 유형의 구성 요소/클래스가 팝업을 생성하는 데 사용되는지 모르므로 내가 원하는 것을 결정할 수 없다. 3D 캔버스에 직접 칠하거나 이전 주석에서 언급 한 클래스 중 하나를 사용할 수 있습니다 ... 팝업이 시작되는 코드가 있습니까? 또는 팝업 내용을 어떻게 제공합니까? – Nate

답변

0

"캔버스가 AWT이기 때문에, 나는 JScrollPane의 대신의 ScrollPane를 사용해야합니다."

왜 이런가요? JScrollPane을 사용할 수 있다고 생각합니다.

Canvas extends java.awt.Component

, 나는 처음에 setLightWeightPopupEnabled(false)JScrollPane JPopupMenu 돌며을 사용하는 아이디어로 주위 놀다 생성자 JScrollPane(java.awt.component component)

+0

캔버스가 스크롤 창에 표시되지 않습니다. 스크롤 구획은, 캔버스의 상부에 위치하는 pop-up 컴퍼넌트의 일부입니다. –

0

이있다. 그러나 이것은 구성 요소 위의 새로운 최상위 창에서 팝업되므로 둥근 테두리가 최상위 창 상단에 그려집니다. 그것은 둥근 테두리가있는 상단에 그려진 JScrollPane을 가진 회색 사각형처럼 보입니다.

그럼 주위에 둥근 테두리를 그릴 수있는 PanelScrollPane을 넣는 방법을 생각했습니다. 아쉽게도 AWT 구성 요소에는 Swing 구성 요소처럼 setOpaque() 속성이 없으므로 사각형입니다. 부모와 동일한 배경색을 복사 할 수 있지만 일부 데이터 위에 표시하려는 경우 꽤 분명합니다.

마침내 내놓은 절충적인 접근 방식은 Container 구성 요소가 ScrollPane 자식 주위에 테두리를 그렸습니다. 이 해킹-Y 솔루션의 확실히 더이지만, 지금까지 그 일 것 유일한 사람입니다 ... 여기에 마지막 코드입니다 :

package stackoverflow; 

import java.awt.Color; 
import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.List; 
import java.awt.Panel; 
import java.awt.Rectangle; 
import java.awt.ScrollPane; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

public class CanvasPopup { 

    public static void main(String[] args) { 
     final Frame f = new Frame("CanvasPopup"); 
     final ScrollPane scroll = new ScrollPane(); 
     final Panel c = new Panel(null) { 
      @Override 
      public void paint(Graphics g) { 
       g.setColor(Color.GREEN); 
       g.fillRect(0, 0, getWidth(), getHeight()); 

       if (scroll.isVisible()) { 
        g.setColor(Color.RED); 
        Rectangle bounds = scroll.getBounds(); 
        g.fillRoundRect(bounds.x - 10, bounds.y - 10, 
          bounds.width + 20, bounds.height + 20, 15, 15); 
       } 
      } 
     }; 

     final List list = new List(); 
     for (int i = 0; i<100; i++) { 
      list.add("Item " + i); 
     } 
     scroll.add(list); 
     scroll.setBounds(75, 75, 150, 150); 
     scroll.setVisible(false); 
     c.add(scroll); 

     c.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       if (!scroll.isVisible()) { 
        scroll.setLocation(e.getPoint()); 
       } 
       scroll.setVisible(!scroll.isVisible()); 
       c.repaint(); 
      } 
     }); 
     f.add(c); 

     f.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 
     f.setSize(300, 300); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

}