2014-10-09 4 views
1

사용자가 treetable의 특정 항목 위로 마우스 커서를 가져 가면 특별한 종류의 툴팁이 나타나게하고 싶습니다. 이 툴팁은 커서가 가리키는 트리 테이블의 항목에 해당하는 PDF의 축소판입니다. 또한 사용자가 커서를 축소판 위로 가져 가서 클릭하여 시스템의 기본 PDF 판독기 (Acrobat, Adobe Reader 등)에서 전체 PDF를 열어야합니다.클릭 할 수있는 툴팁의 축소판 이미지

나는 이것이 매우 어려운 명령이라는 것을 알고 있지만, 나는 대부분의 작업을 이미 끝냈다. 정확한 엄지 손톱을 검색 할 수 있도록 setToolTip() 메서드가 있어야하는 거대한 프로그램에서 정확히 어디에서 발견 했습니까? 또한, Java를 사용하여 PDF에서 미리보기 이미지를 생성하는 것이 너무 어렵다는 것을 발견 했으므로 미리 설정 한 JPG가 미리 표시되도록 미리 설정했습니다. 따라서, 모든 setToolTip() 명령은 어떻게 든 적절한 JPG를 검색해야합니다. 이제 어려운 부분이 있습니다.

처음에는 쉽게 보였습니다. this really convenient hack for putting an image in a tooltip을 시도했는데 제대로 표시되는 미리보기 이미지를 가져옵니다. 그러나 앵커 태그 (<a href="...">...</a>)와 함께 <img> 태그를 둘러싸는 것은 효과가없는 것 같습니다. 미리보기 이미지는 청중의 파란색 테두리로 둘러싸여 있지만 이미지는 클릭 할 수없는 상태로 유지됩니다. 또한 이미지가 클릭되기 전에 툴팁이 사라지는 경우가 있습니다.

그래서 나는 단순한 html 해킹보다 더 깊은 것을 할 필요가 있다고 생각했습니다. this more involved way of putting an image in a tooltip을 시도했지만 정적 이미지에서만 작동합니다. 마우스 커서로 무엇을 가리키고 있는지에 따라 이미지가 달라져야합니다. 또한 내장 된 것보다는이 '툴팁의 사용자 정의 버전'을 사용하도록 내 메소드를 어떻게 설정합니까?

좀 더 컨텍스트를 제공하기 위해, setToolTip() 방법이 작동하는 것 같다 위치는 getTreeCellRendererComponent() 방법, JPanel를 확장하고 TreeCellRenderer를 구현하는 사용자 정의 클래스의 일부의 안에 있습니다. 질문을 받으면 코드를 게시 하겠지만, 다소 복잡하고 따르기가 어려울 수 있습니다. 이견있는 사람?

수정 2010 년 10 월 9 일 4:57 pm :이 코드의 상당 부분이 혼동을 줄 수 있으며, 그 사실을 사과드립니다. JXTreeTable 안에 tri-state 체크 박스를 두는 것과 관련이 있다고 말하면 충분합니다. 어쨌든 중요한 부분은 쉽게 찾아 낼 수 있어야합니다. 보시다시피이 클래스는 이미 JPanel까지 확장되어 있으므로 JToolTip까지 확장 할 수는 없습니다.

package info.chrismcgee.sky.treetable; 

import info.chrismcgee.beans.OrderDetail; 
import info.chrismcgee.components.ImageToolTip; 
import info.chrismcgee.components.TristateCheckBox; 
import info.chrismcgee.components.TristateState; 
import info.chrismcgee.enums.OSType; 

import java.awt.BorderLayout; 
import java.io.File; 

import javax.swing.JComponent; 
import javax.swing.JPanel; 
import javax.swing.JToolTip; 
import javax.swing.JTree; 
import javax.swing.tree.TreeCellRenderer; 
import javax.swing.tree.TreePath; 

import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode; 

public class SkyCheckTreeCellRenderer extends JPanel implements 
     TreeCellRenderer { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = -2728513730497144120L; 
    private SkyCheckTreeSelectionModel selectionModel; 
    private TreeCellRenderer delegate; 
    private boolean showRootNodeCheckBox; 
    private TristateCheckBox checkBox = new TristateCheckBox(""); 
    protected SkyCheckTreeManager.CheckBoxCustomizer checkBoxCustomer; 
    private String jobsFolderStr = OSType.getOSType() == OSType.MAC 
      ? "/Volumes/ArtDept/ArtDept/JOBS" 
      : "//SKYFS/ArtDept/ArtDept/JOBS"; 

    public SkyCheckTreeCellRenderer(TreeCellRenderer delegate, 
      SkyCheckTreeSelectionModel selectionModel, 
      boolean showRootNodeCheckBox) { 
     this.delegate = delegate; 
     this.selectionModel = selectionModel; 
     this.showRootNodeCheckBox = showRootNodeCheckBox; 
     setLayout(new BorderLayout()); 
     setOpaque(false); 
     checkBox.setOpaque(false); 
    } 

    public JToolTip createToolTip() { 
     return new ImageToolTip(); 
    } 

    private String getToolTipText(DefaultMutableTreeTableNode node) 
    { 
     if (node.getUserObject() instanceof OrderDetail) 
     { 
      OrderDetail od = (OrderDetail) node.getUserObject(); 
      String thousandsFolderStr = jobsFolderStr + "/" 
        + od.getOrderId().substring(0, 3) + "000-" 
        + od.getOrderId().substring(0, 3) + "999/"; 

      String productFolderStr = thousandsFolderStr + od.getOrderId() 
        + " Folder/"; 
      if (!od.getProductDetail().equals("")) 
       productFolderStr = thousandsFolderStr + od.getOrderId() + "/"; 

      String img = productFolderStr + od.getOrderId() + "_THUMB.jpg"; 
      if (!od.getProductDetail().equals("")) 
       img = productFolderStr + od.getOrderId() + "_" + od.getProductDetail() + "_THUMB.jpg"; 

      if (new File(img).exists()) 
       return "<html><img src=\"file://" + img + "\"></html>"; 
     } 
     return null; 
    } 

    public JComponent getTreeCellRendererComponent(JTree tree, Object value, 
      boolean selected, boolean expanded, boolean leaf, int row, 
      boolean hasFocus) 
    { 
     JComponent renderer = (JComponent) delegate.getTreeCellRendererComponent(tree, value, 
       selected, expanded, leaf, row, hasFocus); 

     if (!showRootNodeCheckBox && tree.getModel().getRoot() == value) 
     { 
      renderer.setToolTipText(getToolTipText((DefaultMutableTreeTableNode)value)); 
      return renderer; 
     } 

     TreePath path = tree.getPathForRow(row); 
     if (path != null) { 
      if (checkBoxCustomer != null && !checkBoxCustomer.showCheckBox(path)) 
      { 
       renderer.setToolTipText(getToolTipText((DefaultMutableTreeTableNode)value)); 
       return renderer; 
      } 
      if (selectionModel.isPathSelected(path, selectionModel.isDigged())) 
       checkBox.getTristateModel().setState(TristateState.SELECTED); 
      else 
       checkBox.getTristateModel().setState(selectionModel.isDigged() 
         && selectionModel.isPartiallySelected(path) 
          ? TristateState.INDETERMINATE 
          : TristateState.DESELECTED); 
     } 
     removeAll(); 
     add(checkBox, BorderLayout.WEST); 
     add(renderer, BorderLayout.CENTER); 
     setToolTipText(getToolTipText((DefaultMutableTreeTableNode)value)); 
     return this; 
    } 

} 

나는 어떻게 든이 JToolTip을 확장 할 필요가 있음을 얻고,이 SkyCheckTreeCellRenderer 클래스는 어떻게 든 참조하는 사용자 정의 도구 설명 할 필요가있다. 나는이 모든 것이 단지 너무 복잡하고 복잡하여 나의 단순한 뇌가 문제를 해결하는 데 어려움을 겪고 있다고 생각한다. 내 사과.

답변

1

detailed in JToolTip과 같이 맞춤 툴팁을 작성해야하는 것처럼 들립니다.

클릭하면 런타임을 사용하여 명령 줄에서 파일을 열어야합니다. Windows에서이 작업을 수행하는 방법은 here입니다. 우분투에서이 작업을 수행하는 방법은 내가 대신이 '툴팁의 사용자 정의 버전'을 사용하려면 내 방법을 설정하는 방법 here

2

을 게시 내장 된 하나?

예 에서처럼 사용자 지정 도구 설명을 사용하도록 구성 요소를 확장해야합니다.

나는 마우스 커서 그런

에 마우스 커서를 올려 확인한되고 있는지 당신이 원하는 이미지를 나타내는 텍스트 문자열을 반환 getToolTipText(MouseEvent) 메소드를 오버라이드 (override) 할 필요가에 따라 다를 수 이미지를 필요 디스플레이.

그러나, 앵커 태그 (...)로 태그를 둘러싸고있는 것은 매우

당신이 하이퍼 링크에 응답하려는 경우 JEditorPane로를 사용할 필요가 작동하지 않습니다. JEditorPane API의 예를 읽어주세요.

그래서 기본적으로 JEditorPane을 사용하여 적절한 이미지를 적절한 하이퍼 링크와 함께 표시하는 사용자 정의 JToolTip을 사용해야한다고 제안합니다. 다음은 JLabel을 도구 팁의 추가 구성 요소로 사용하는 방법을 보여주는 예제입니다. JEditorPane을 사용하도록 코드를 수정할 수 있어야합니다.

또한이 사용자 정의 JToolTip을 사용하려면 트리 테이블을 확장해야합니다.

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.net.URL; 
import java.io.*; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class ToolTipImage extends JToolTip 
{ 
    private Image image; 

    public ToolTipImage(Image image) 
    { 
     this.image = image; 

     setLayout(new BorderLayout()); 
     add(new JLabel(new ImageIcon(image))); 
    } 

    @Override 
    public Dimension getPreferredSize() 
    { 
     return new Dimension(image.getWidth(this), image.getHeight(this)); 
    } 

    private static void createAndShowGUI() throws Exception 
    { 
     final BufferedImage testImage = ImageIO.read(new File("dukewavered.gif")); 

     String[] columnNames = {"Column 0", "Column 1"}; 

     Object[][] data = 
     { 
      {"Cell 0,0", "Cell 0,1"}, 
      {"Cell 1,0", "Cell 1,1"} 
     }; 

     JTable table = new JTable(data, columnNames) 
     { 
      public JToolTip createToolTip() 
      { 
       return new ToolTipImage(testImage); 
      } 
     }; 

     // Set tool tip text so that table is registered w/ tool tip manager 
     table.setToolTipText(" "); 

     JFrame frame = new JFrame("Tool Tip Image"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JScrollPane(table)); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       try 
       { 
        createAndShowGUI(); 
       } 
       catch(Exception e) { System.out.println(e); } 
      } 
     }); 
    } 
} 
+0

내가 어디로가는 지 알지만 관련 클래스는 이미'JPanel'을 확장했습니다. 내가 어디에서 왔는지 이해하려면 편집을 참조하십시오. 어떤 아이디어, @camickr 또는 @ControlAltDel? – Sturm

+0

@Sturm'이 클래스는 이미 JPanel을 확장하므로 JToolTip도 확장 할 수는 없습니다. JToolTip도 확장해야한다고는 말한 적이 없습니다. 이 예제에서'ToolTipImage' 클래스는 별도의 클래스입니다. – camickr