JLabelとJButtonを含む複合オブジェクトのJTreeを作成しようとしています。ノードはJLabelによって示されるサーバーとポートを表しています.JButtonはDesktop APIを使用してデフォルトのブラウザを開き、URLに移動します。複合JTreeノードの下にあるオブジェクトにイベントを渡すノード
私は次のことをすでに読んでおり、できるだけ忠実に従ってきました。ノードはどのようにして表示されますか(主に後でそれをより良くすることができます)が、ボタンをクリックしようとするとJTreeはボタンではなくイベントに応答します。 JButtonまたはJLabelの - 私は、それらが下にオブジェクト(複数可)によって処理されるようにイベントがJTreeの通過を可能にする方法を知っておく必要があり
java swing: add custom graphical button to JTree item
http://www.java2s.com/Code/Java/Swing-JFC/TreeCellRenderer.htm
https://stackoverflow.com/a/3769158/1344282
。ここで
は私のTreeCellEditorです:ここでは
public class UrlValidationCellEditor extends DefaultTreeCellEditor
{
public UrlValidationCellEditor(JTree tree, DefaultTreeCellRenderer renderer)
{
super(tree, renderer);
}
@Override
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean isSelected, boolean expanded, boolean leaf, int row)
{
return renderer.getTreeCellRendererComponent(tree, value, true, expanded, leaf, row, true);
}
@Override
public boolean isCellEditable(EventObject anEvent)
{
return true; // Or make this conditional depending on the node
}
}
はのTreeCellRendererです:
public class UrlValidationRenderer extends DefaultTreeCellRenderer implements TreeCellRenderer
{
JLabel titleLabel;
UrlGoButton goButton;
JPanel renderer;
DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
public UrlValidationRenderer()
{
renderer = new JPanel(new GridLayout(1, 2));
titleLabel = new JLabel(" ");
titleLabel.setForeground(Color.blue);
renderer.add(titleLabel);
goButton = new UrlGoButton();
renderer.add(goButton);
renderer.setBorder(BorderFactory.createLineBorder(Color.black));
backgroundSelectionColor = defaultRenderer
.getBackgroundSelectionColor();
backgroundNonSelectionColor = defaultRenderer
.getBackgroundNonSelectionColor();
}
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus)
{
Component returnValue = null;
if ((value != null) && (value instanceof DefaultMutableTreeNode))
{
Object userObject = ((DefaultMutableTreeNode) value)
.getUserObject();
if (userObject instanceof UrlValidation)
{
UrlValidation validationResult = (UrlValidation) userObject;
titleLabel.setText(validationResult.getServer()+":"+validationResult.getPort());
goButton.setUrl(validationResult.getUrl());
if (selected) {
renderer.setBackground(backgroundSelectionColor);
} else {
renderer.setBackground(backgroundNonSelectionColor);
}
renderer.setEnabled(tree.isEnabled());
returnValue = renderer;
}
}
if (returnValue == null)
{
returnValue = defaultRenderer.getTreeCellRendererComponent(tree,
value, selected, expanded, leaf, row, hasFocus);
}
return returnValue;
}
}
私は任意の洞察力や提案をいただければ幸いです。ありがとう!
ユーザーがそのツリーノードを選択したのにボタンを選択しなかった場合、どうなるでしょうか? –
まあ、ノードにはラベルとボタンの2つの部分が必要です。ユーザーがラベルをクリックすると、ノードに関する詳細な情報がGUIの別の部分に表示されます。ユーザーがボタンをクリックすると、ブラウザウィンドウが開きます。 JTreeがユーザー入力に応答するのを防ぐ方法がわからないので、ユーザーがラベルまたはボタンをクリックしたときに、それらのイベントがそれぞれラベルまたはボタンによって処理されるようになります。 – Kal