Java 在JPanel上居中JPanel和在(JUNG)图上居中视图

Java 在JPanel上居中JPanel和在(JUNG)图上居中视图,java,swing,jpanel,jung,Java,Swing,Jpanel,Jung,我有一个应用程序,在那里我得到一个图的顶点和边作为输入并绘制该图。当应用程序启动时,由于没有图形可显示,我将放置在一个占位符面板上,然后将绘制了图形的jpanel添加到占位符面板上。但问题是我必须手动设置大小。我在用JUNG画图表 (问题无关?但我不想创建两个不同的帖子。) 第一个问题:是否有一种方法可以自动添加图形面板,以便它使用占位符面板的整个区域?下面是它当前外观的屏幕截图 第二个问题:当我添加时,因为我将JUNG graph布局设置得非常大,所以图形没有居中。我必须搜索图表。我希望图形以

我有一个应用程序,在那里我得到一个图的顶点和边作为输入并绘制该图。当应用程序启动时,由于没有图形可显示,我将放置在一个占位符面板上,然后将绘制了图形的jpanel添加到占位符面板上。但问题是我必须手动设置大小。我在用JUNG画图表

(问题无关?但我不想创建两个不同的帖子。)

第一个问题:是否有一种方法可以自动添加图形面板,以便它使用占位符面板的整个区域?下面是它当前外观的屏幕截图

第二个问题:当我添加时,因为我将JUNG graph布局设置得非常大,所以图形没有居中。我必须搜索图表。我希望图形以视图为中心。怎么做

截图:

从截图中可以看出,第二个面板看起来有点难看,看起来不像是面板的一部分。我希望占位符面板有一个固定的大小,然后图形面板要像那样宽,不管图形有多大/多小。如果图形较大,则应激活滚动条,否则不应显示滚动条

这是我的占位符面板:

    placeHolderPanel = new JPanel();
    blackLine = BorderFactory.createLineBorder(Color.BLACK);
    title = BorderFactory.createTitledBorder(blackLine,"Graph");
    title.setTitleJustification(TitledBorder.LEFT);
    border = title.getBorder();
    margin = new EmptyBorder(15,15,15,15);
    title.setBorder(new CompoundBorder(margin,border));

    placeHolderPanel.setBorder(title);
    placeHolderPanel.setLayout(new FlowLayout());
    placeHolderPanel.setPreferredSize(new Dimension(300,300));
单击按钮后,我将图形面板添加到位置保持器面板(表格是一个包含绘制图形所需所有数据的表格):

以下是如何使用JUNG可视化图形:

    graph =  new MyGraphCreationClass(vertices,edges).getGraph();

    layout = new CircleLayout(graph);
    layout.setSize(new Dimension(1000,1000));
    //BasicVisualizationServer<Integer,String> vv =
             //new BasicVisualizationServer<Integer,String>(layout);
    vv = new VisualizationViewer<Integer, String>(layout);
    vv.setPreferredSize(new Dimension(900,208));
    vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
    vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller());
    vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line<Integer,String>());
    vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);
    vv.setAlignmentX(Component.CENTER_ALIGNMENT);
    vv.setAlignmentY(Component.CENTER_ALIGNMENT);
    gm = new DefaultModalGraphMouse();
    gm.setMode(ModalGraphMouse.Mode.TRANSFORMING);
    vv.setGraphMouse(gm);

    ScalingControl visualizationViewerScalingControl
    = new CrossoverScalingControl();

    vv.scaleToLayout(visualizationViewerScalingControl);

    scrollPane = new GraphZoomScrollPane(vv);

    //scrollPane.setPreferredSize(new Dimension(100,200));
    add(scrollPane, BorderLayout.CENTER);
    //this.setPreferredSize(new Dimension(100,200));
graph=newMyGraphCreationClass(顶点、边).getGraph();
布局=新的圆形布局(图形);
布局.设置尺寸(新尺寸(10001000));
//基本可视化服务器=
//新的基本可视化服务器(布局);
vv=新的VisualizationViewer(布局);
vv.设置首选尺寸(新尺寸(900208));
vv.getRenderContext().setVertexLabelTransformer(新ToStringLabeler());
vv.getRenderContext().setEdgeLabelTransformer(新的ToStringLabeller());
vv.getRenderContext().setEdgeShapeTransformer(新EdgeShape.Line());
getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);
vv.setAlignmentX(部件中心对齐);
vv.setAlignmentY(部件中心对齐);
gm=新的默认ModalGraphMouse();
gm.setMode(ModalGraphMouse.Mode.TRANSFORMING);
vv.setGraphMouse(gm);
缩放控件可视化视图缩放控件
=新的交叉缩放控制();
vv.缩放布局(可视化视图缩放控制);
滚动窗格=新图形ZoomScrollPane(vv);
//scrollPane.setPreferredSize(新维度(100200));
添加(滚动窗格,BorderLayout.CENTER);
//此.setPreferredSize(新尺寸(100200));

问题是否无关?但是我不想创建两个不同的帖子
——如果问题不相关,那么每个问题都应该有不同的帖子。当你有与不同问题相关的评论/答案时,它会变得混乱。此外,当你问一个问题时,你应该“接受”你问题的最佳答案。但每个问题你只能接受一个答案。但是,这些问题有些关联,因为它们都与屏幕布局有关。占位符面板可能应该使用边界布局。然后,添加到其中的任何组件都将占用所有可用空间。
    graph =  new MyGraphCreationClass(vertices,edges).getGraph();

    layout = new CircleLayout(graph);
    layout.setSize(new Dimension(1000,1000));
    //BasicVisualizationServer<Integer,String> vv =
             //new BasicVisualizationServer<Integer,String>(layout);
    vv = new VisualizationViewer<Integer, String>(layout);
    vv.setPreferredSize(new Dimension(900,208));
    vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
    vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller());
    vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line<Integer,String>());
    vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);
    vv.setAlignmentX(Component.CENTER_ALIGNMENT);
    vv.setAlignmentY(Component.CENTER_ALIGNMENT);
    gm = new DefaultModalGraphMouse();
    gm.setMode(ModalGraphMouse.Mode.TRANSFORMING);
    vv.setGraphMouse(gm);

    ScalingControl visualizationViewerScalingControl
    = new CrossoverScalingControl();

    vv.scaleToLayout(visualizationViewerScalingControl);

    scrollPane = new GraphZoomScrollPane(vv);

    //scrollPane.setPreferredSize(new Dimension(100,200));
    add(scrollPane, BorderLayout.CENTER);
    //this.setPreferredSize(new Dimension(100,200));