Java 边类型已更改为正交,无法单击边
我正在使用JUNG构造一条有向边,并将边类型从默认设置更改为正交边类型。将边缘类型更改为“正交”后,我无法使边缘可单击。我做错了什么Java 边类型已更改为正交,无法单击边,java,jung,Java,Jung,我正在使用JUNG构造一条有向边,并将边类型从默认设置更改为正交边类型。将边缘类型更改为“正交”后,我无法使边缘可单击。我做错了什么 package test; import edu.uci.ics.jung.algorithms.layout.CircleLayout; import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.graph.DirectedSparseGraph; import edu.
package test;
import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.graph.DirectedSparseGraph;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.control.CrossoverScalingControl;
import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse;
import edu.uci.ics.jung.visualization.control.ModalGraphMouse;
import edu.uci.ics.jung.visualization.control.ScalingControl;
import edu.uci.ics.jung.visualization.decorators.EdgeShape;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import edu.uci.ics.jung.visualization.picking.PickedState;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Paint;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Collection;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.apache.commons.collections15.Transformer;
import org.apache.commons.collections15.functors.ConstantTransformer;
public class Test2 {
public static void main(String args[])
{
Graph graph = new DirectedSparseGraph<String, String>();
graph.addEdge("Edge 1", "Peer 1", "Peer 2");
graph.addEdge("Edge 2", "Peer 2", "Peer 3");
graph.addEdge("Edge 3", "Peer 3", "Peer 1");
Layout<Integer, String> layout = new CircleLayout(graph);
VisualizationViewer tempViewer = new VisualizationViewer<>(layout);
tempViewer.setPreferredSize(new Dimension(700,700));
tempViewer.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
tempViewer.setVertexToolTipTransformer(new ToStringLabeller());
tempViewer.getRenderContext().setArrowFillPaintTransformer(new ConstantTransformer(Color.lightGray));
DefaultModalGraphMouse graphMouse = new DefaultModalGraphMouse();
tempViewer.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Orthogonal<>()); // If I comment this line, the program works perfectly fine
graphMouse.setMode(ModalGraphMouse.Mode.PICKING);
Transformer<String, Paint> edgePaint = new Transformer<String, Paint>() {
@Override
public Paint transform(String graphEdge) {
int redValue = Math.abs(graphEdge.hashCode() % 235);
int greenValue = Math.abs(graphEdge.hashCode() % 205);
int blueValue = Math.abs(graphEdge.hashCode() % 175);
return new Color(redValue, greenValue, blueValue);
}
};
tempViewer.getRenderContext().setEdgeDrawPaintTransformer(edgePaint);
tempViewer.setGraphMouse(graphMouse);
final PickedState<String> pickedState = tempViewer.getPickedEdgeState();
pickedState.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
Object subject = e.getItem();
if (subject instanceof String) {
String edgePicked = (String) subject;
if (pickedState.isPicked(edgePicked)) {
Graph newGraph = new DirectedSparseGraph<String, String>();
newGraph.addEdge("Edge 5", "Peer 1 ", "Peer 2");
newGraph.addEdge("Edge 6", "Peer 2", "Peer 3");
newGraph.addEdge("Edge 7", "Peer 3", "Peer 1");
Layout<Integer, String> graphlayout = new CircleLayout(newGraph);
VisualizationViewer chartViewer = new VisualizationViewer<>(graphlayout);
JPanel tempPanel = new JPanel();
tempPanel.add(chartViewer);
JFrame tempFrame = new JFrame("Sample Data ");
tempFrame.getContentPane().add(tempPanel);
tempFrame.pack();
tempFrame.setVisible(true);
}
}
}
});
JPanel graphPanel = new JPanel(new BorderLayout());
graphPanel.add(tempViewer, BorderLayout.CENTER);
JPanel controlPanel = addLegendControls(tempViewer, graph);
graphPanel.add(controlPanel, BorderLayout.SOUTH);
JFrame masterFrame = new JFrame();
masterFrame.add(graphPanel);
masterFrame.pack();
masterFrame.setVisible(true);
}
static JPanel addLegendControls(VisualizationViewer chartViewer, Graph tempGraph)
{
JPanel masterPanel = new JPanel(new BorderLayout());
JPanel secondPanel = new JPanel(new GridLayout(1, 2));
DefaultModalGraphMouse graphMouse = new DefaultModalGraphMouse();
chartViewer.setGraphMouse(graphMouse);
JComboBox modeBox = graphMouse.getModeComboBox();
modeBox.addItemListener(graphMouse.getModeListener());
graphMouse.setMode(ModalGraphMouse.Mode.TRANSFORMING);
final ScalingControl scalerGraph = new CrossoverScalingControl();
JButton zoomPlus = new JButton("+");
zoomPlus.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
scalerGraph.scale(chartViewer, 1.1f, chartViewer.getCenter());
}
});
JButton zoomMinus = new JButton("-");
zoomMinus.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
scalerGraph.scale(chartViewer, 1 / 1.1f, chartViewer.getCenter());
}
});
final int defaultRowSize = 10;
JPanel legendBox = new JPanel(new GridLayout(defaultRowSize, 1));
int borderThickness = 2;
legendBox.setBorder(BorderFactory.createLineBorder(Color.BLACK, borderThickness));
JLabel legendLabel = new JLabel(" LEGEND ");
legendBox.add(legendLabel);
Collection<String> graphEdges = tempGraph.getEdges();
for ( String graphLabel : graphEdges) {
Color edgeColor = (Color)chartViewer.getRenderContext().getEdgeDrawPaintTransformer().transform(graphLabel);
JPanel circlePanel = new JPanel() {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(edgeColor);
g.fillOval(2, 9, 10, 10);
}
};
JLabel edgeLabel = new JLabel(" " + graphLabel + " Sent From: " + tempGraph.getSource(graphLabel) + " To : " + tempGraph.getDest(graphLabel));
circlePanel.add(edgeLabel);
legendBox.add(circlePanel);
}
JPanel modePanel = new JPanel(new GridLayout(1, 1));
modePanel.setBorder(BorderFactory.createTitledBorder("Mouse Mode"));
modePanel.add(modeBox);
secondPanel.add(modePanel);
JPanel zoomPanel = new JPanel(new GridLayout(1, 2));
zoomPanel.setBorder(BorderFactory.createTitledBorder("Manual Zoom Controls"));
zoomPanel.add(zoomPlus);
zoomPanel.add(zoomMinus);
secondPanel.add(zoomPanel);
masterPanel.add(secondPanel, BorderLayout.SOUTH);
masterPanel.add(legendBox, BorderLayout.EAST);
return masterPanel;
}
}
封装测试;
导入edu.uci.ics.jung.algorithms.layout.CircleLayout;
导入edu.uci.ics.jung.algorithms.layout.layout;
导入edu.uci.ics.jung.graph.DirectedSparseGraph;
导入edu.uci.ics.jung.graph.graph;
导入edu.uci.ics.jung.visualization.VisualizationViewer;
导入edu.uci.ics.jung.visualization.control.CrossoverScalingControl;
导入edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse;
导入edu.uci.ics.jung.visualization.control.ModalGraphMouse;
导入edu.uci.ics.jung.visualization.control.ScalingControl;
导入edu.uci.ics.jung.visualization.decorators.EdgeShape;
导入edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
导入edu.uci.ics.jung.visualization.picking.PickedState;
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.GridLayout;
导入java.awt.Paint;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.ItemEvent;
导入java.awt.event.ItemListener;
导入java.util.Collection;
导入javax.swing.BorderFactory;
导入javax.swing.JButton;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入org.apache.commons.collections15.Transformer;
导入org.apache.commons.collections15.functors.constantttransformer;
公共类Test2{
公共静态void main(字符串参数[])
{
图形=新的DirectedSparseGraph();
图.附录(“边缘1”、“对等点1”、“对等点2”);
图.附录(“边缘2”、“对等点2”、“对等点3”);
图.附录(“边缘3”、“对等点3”、“对等点1”);
布局=新的圆形布局(图形);
VisualizationViewer tempViewer=新建VisualizationViewer(布局);
tempViewer.setPreferredSize(新维度(700700));
tempViewer.getRenderContext().setVertexLabelTransformer(新的ToStringLabeller());
tempViewer.SetVertextooltTransformer(新ToStringLabeller());
tempViewer.getRenderContext().setArrowFillPaintTransformer(新ConstantTransformer(Color.lightGray));
DefaultModalGraphMouse graphMouse=新建DefaultModalGraphMouse();
tempViewer.getRenderContext().setEdgeShapeTransformer(新的EdgeShape.Orthogonal());//如果我对这行进行注释,程序运行得非常好
graphMouse.setMode(ModalGraphMouse.Mode.PICKING);
变压器边缘点=新变压器(){
@凌驾
公共绘制变换(字符串图形边缘){
int redValue=Math.abs(graphEdge.hashCode()%235);
int greenValue=Math.abs(graphEdge.hashCode()%205);
int blueValue=Math.abs(graphEdge.hashCode()%175);
返回新颜色(红色值、绿色值、蓝色值);
}
};
tempViewer.getRenderContext().setEdgeDrawPaintTransformer(edgePaint);
tempViewer.setGraphMouse(graphMouse);
final PickedState PickedState=tempViewer.getPickedEdgeState();
pickedState.addItemListener(新的ItemListener(){
@凌驾
公共无效itemStateChanged(ItemEvent e){
Object subject=e.getItem();
if(字符串的主题实例){
字符串edgePicked=(字符串)主题;
if(pickedState.isPicked(edgePicked)){
Graph newGraph=新的DirectedSparseGraph();
newGraph.addEdge(“边缘5”、“对等点1”、“对等点2”);
newGraph.addEdge(“边缘6”、“对等点2”、“对等点3”);
newGraph.addEdge(“边缘7”、“对等点3”、“对等点1”);
布局图布局=新的圆形布局(newGraph);
VisualizationViewer chartViewer=新的VisualizationViewer(图形布局);
JPanel tempanel=新的JPanel();
添加(图表查看器);
JFrame tempFrame=新JFrame(“样本数据”);
tempFrame.getContentPane().add(tempPanel);
tempFrame.pack();
tempFrame.setVisible(true);
}
}
}
});
JPanel graphPanel=newjpanel(newborderlayout());
添加(tempViewer、BorderLayout.CENTER);
JPanel controlPanel=addLegendControls(tempViewer,图形);
graphPanel.add(控制面板,BorderLayout.SOUTH);
JFrame masterFrame=新JFrame();
主框架。添加(图形面板);
masterFrame.pack();
masterFrame.setVisible(真);
}
静态JPanel addLegendControls(VisualizationViewer图表查看器,Graph tempGraph)
{
JPanel主面板=新的JPanel(新的BorderLayout());
JPanel secondPanel=新JPanel(新网格布局(1,2));
DefaultModalGraphMouse graphMouse=新建DefaultModalGraphMouse();
chartViewer.setGraphMouse(graphMouse);
JComboBox modeBox=graphMouse.getModeComboBox();
addItemListener(graphMouse.getModelListener());
graphMouse.setMode(ModalGraphMouse.Mode.TRANSFORMING);
最终缩放控制缩放图=新的交叉缩放控制();
JButton zoomPlus=新JButton(“+”);
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
scalerGraph.scale(chartViewer,1.1f,chartViewer.getCenter());
}
});
JButton zoomMinus=新JButton(“-”);
zoomMinus.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
scalerGraph.scale(chartViewer,1/1.1f,chartViewer.getCenter());
}
});
最终int defaultRowSize=10;
JPa
tempViewer.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Orthogonal<String, String>());
package test;
import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.graph.DirectedSparseGraph;
import edu.uci.ics.jung.graph.DirectedSparseMultigraph;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.control.CrossoverScalingControl;
import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse;
import edu.uci.ics.jung.visualization.control.ModalGraphMouse;
import edu.uci.ics.jung.visualization.control.ScalingControl;
import edu.uci.ics.jung.visualization.decorators.EdgeShape;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import edu.uci.ics.jung.visualization.picking.PickedState;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Paint;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Collection;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.apache.commons.collections15.Transformer;
import org.apache.commons.collections15.functors.ConstantTransformer;
public class Test2 {
public static void main(String args[])
{
Graph graph = new DirectedSparseMultigraph<String, String>();
graph.addEdge("Edge 1", "Peer 1", "Peer 2");
graph.addEdge("Edge 2", "Peer 2", "Peer 3");
graph.addEdge("Edge 3", "Peer 3", "Peer 1");
Layout<String, String> layout = new CircleLayout(graph);
VisualizationViewer<String, String> tempViewer = new VisualizationViewer<>(layout);
tempViewer.setPreferredSize(new Dimension(700,700));
tempViewer.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
tempViewer.setVertexToolTipTransformer(new ToStringLabeller());
tempViewer.getRenderContext().setArrowFillPaintTransformer(new ConstantTransformer(Color.lightGray));
DefaultModalGraphMouse graphMouse = new DefaultModalGraphMouse();
tempViewer.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Orthogonal<String, String>()); // If I comment this line, the program works perfectly fine
graphMouse.setMode(ModalGraphMouse.Mode.PICKING);
Transformer<String, Paint> edgePaint = new Transformer<String, Paint>() {
@Override
public Paint transform(String graphEdge) {
int redValue = Math.abs(graphEdge.hashCode() % 235);
int greenValue = Math.abs(graphEdge.hashCode() % 205);
int blueValue = Math.abs(graphEdge.hashCode() % 175);
return new Color(redValue, greenValue, blueValue);
}
};
tempViewer.getRenderContext().setEdgeDrawPaintTransformer(edgePaint);
tempViewer.setGraphMouse(graphMouse);
final PickedState<String> pickedState = tempViewer.getPickedEdgeState();
pickedState.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
Object subject = e.getItem();
if (subject instanceof String) {
String edgePicked = (String) subject;
if (pickedState.isPicked(edgePicked)) {
Graph newGraph = new DirectedSparseGraph<String, String>();
newGraph.addEdge("Edge 5", "Peer 1 ", "Peer 2");
newGraph.addEdge("Edge 6", "Peer 2", "Peer 3");
newGraph.addEdge("Edge 7", "Peer 3", "Peer 1");
Layout<String, String> graphlayout = new CircleLayout(newGraph);
VisualizationViewer chartViewer = new VisualizationViewer<>(graphlayout);
JPanel tempPanel = new JPanel();
tempPanel.add(chartViewer);
JFrame tempFrame = new JFrame("Sample Data ");
tempFrame.getContentPane().add(tempPanel);
tempFrame.pack();
tempFrame.setVisible(true);
}
}
}
});
JPanel graphPanel = new JPanel(new BorderLayout());
graphPanel.add(tempViewer, BorderLayout.CENTER);
JPanel controlPanel = addLegendControls(tempViewer, graph);
graphPanel.add(controlPanel, BorderLayout.SOUTH);
JFrame masterFrame = new JFrame();
masterFrame.add(graphPanel);
masterFrame.pack();
masterFrame.setVisible(true);
}
static JPanel addLegendControls(VisualizationViewer chartViewer, Graph tempGraph)
{
JPanel masterPanel = new JPanel(new BorderLayout());
JPanel secondPanel = new JPanel(new GridLayout(1, 2));
DefaultModalGraphMouse graphMouse = new DefaultModalGraphMouse();
chartViewer.setGraphMouse(graphMouse);
JComboBox modeBox = graphMouse.getModeComboBox();
modeBox.addItemListener(graphMouse.getModeListener());
graphMouse.setMode(ModalGraphMouse.Mode.TRANSFORMING);
final ScalingControl scalerGraph = new CrossoverScalingControl();
JButton zoomPlus = new JButton("+");
zoomPlus.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
scalerGraph.scale(chartViewer, 1.1f, chartViewer.getCenter());
}
});
JButton zoomMinus = new JButton("-");
zoomMinus.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
scalerGraph.scale(chartViewer, 1 / 1.1f, chartViewer.getCenter());
}
});
final int defaultRowSize = 10;
JPanel legendBox = new JPanel(new GridLayout(defaultRowSize, 1));
int borderThickness = 2;
legendBox.setBorder(BorderFactory.createLineBorder(Color.BLACK, borderThickness));
JLabel legendLabel = new JLabel(" LEGEND ");
legendBox.add(legendLabel);
Collection<String> graphEdges = tempGraph.getEdges();
for ( String graphLabel : graphEdges) {
Color edgeColor = (Color)chartViewer.getRenderContext().getEdgeDrawPaintTransformer().transform(graphLabel);
JPanel circlePanel = new JPanel() {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(edgeColor);
g.fillOval(2, 9, 10, 10);
}
};
JLabel edgeLabel = new JLabel(" " + graphLabel + " Sent From: " + tempGraph.getSource(graphLabel) + " To : " + tempGraph.getDest(graphLabel));
circlePanel.add(edgeLabel);
legendBox.add(circlePanel);
}
JPanel modePanel = new JPanel(new GridLayout(1, 1));
modePanel.setBorder(BorderFactory.createTitledBorder("Mouse Mode"));
modePanel.add(modeBox);
secondPanel.add(modePanel);
JPanel zoomPanel = new JPanel(new GridLayout(1, 2));
zoomPanel.setBorder(BorderFactory.createTitledBorder("Manual Zoom Controls"));
zoomPanel.add(zoomPlus);
zoomPanel.add(zoomMinus);
secondPanel.add(zoomPanel);
masterPanel.add(secondPanel, BorderLayout.SOUTH);
masterPanel.add(legendBox, BorderLayout.EAST);
return masterPanel;
}
}