사용자가 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 클래스는 어떻게 든 참조하는 사용자 정의 도구 설명 할 필요가있다. 나는이 모든 것이 단지 너무 복잡하고 복잡하여 나의 단순한 뇌가 문제를 해결하는 데 어려움을 겪고 있다고 생각한다. 내 사과.
내가 어디로가는 지 알지만 관련 클래스는 이미'JPanel'을 확장했습니다. 내가 어디에서 왔는지 이해하려면 편집을 참조하십시오. 어떤 아이디어, @camickr 또는 @ControlAltDel? – Sturm
@Sturm'이 클래스는 이미 JPanel을 확장하므로 JToolTip도 확장 할 수는 없습니다. JToolTip도 확장해야한다고는 말한 적이 없습니다. 이 예제에서'ToolTipImage' 클래스는 별도의 클래스입니다. – camickr