Java: Agregar panel dentro de otro en el tiempo de ejecución para adaptarse al área visible
Pregunta
En mi aplicación quiero mostrar el gráfico generado, usando Jung. Produce objeto jpanel como salida. Entonces, pensé que sería solo una cuestión de agregar un componente al panel. Pero el gráfico se dibuja fuera de su panel principal. Captura de pantalla:¿Cómo restringo el gráfico para estar solo dentro del área visible? El código que utilizo para agregar gráfico al panel es este (el borde fue para ver bordes de panel, aunque no se muestra por alguna razón):
Layout<Object, String> layout = new CircleLayout<Object, String> (graphProvider.getGraph());
layout.setSize(panel.getMarketGraphPane().getPreferredSize());
BasicVisualizationServer<Object,String> graphPanel = new BasicVisualizationServer<Object,String>(layout);
graphPanel.setBorder(new EtchedBorder());
graphPanel.setSize(panel.getMarketGraphPane().getPreferredSize());
panel.getMarketGraphPane().add(graphPanel, BorderLayout.CENTER);
panel.getMarketGraphPane().revalidate();
Solución
Use GraphZoomScrollPane para agregar un contenedor ScrollPane de gráficos Zoom -able para el objeto VisualizationViewer de la siguiente manera:
GraphZoomScrollPane pane = new GraphZoomScrollPane(visualizationViewer);
JPanel panel = new JPanel();
BorderLayout panelMapLayout = new BorderLayout();
panel.setLayout(panelMapLayout);
panel.add(pane, BorderLayout.CENTER);
Otros consejos
muy poca información para la imagen real
1 depende
qué
Size
devuelve (gráfico generado, usando Jung), ¿está configurado allí setSize (int, int) también,si es gráfico reestriziable,
2) Eliminar
layout.setSize(panel.getMarketGraphPane().getPreferredSize());
y
graphPanel.setSize(panel.getMarketGraphPane().getPreferredSize());
no puedes setSize
Para el objeto colocado al BorderLayout.CENTER
, y creo que eso es posible directamente (generated graph, using JUNG. It produces JPanel object
) hacia BorderLayout.CENTER
área, intenta que tal vez tu twice setSize
generó algo de desastre
Y luego solo puedes llamar
panel.add(graphPanel, BorderLayout.CENTER);
panel.revalidate();
panel.repaint();
3) Otras dos elecciones (sin limpieza setSize
)
llamar
pack();
hacia Contenedor de nivel superior, Note cuidadosamente con límites de monitores LCD/LEDPon eso al Jscrollpane