with resizing redimensionar swing resize

swing - resizing - redimensionar jframe netbeans



cambio de tamaƱo de java (1)

Si el XML especifica las ubicaciones absolutas, probablemente no haya forma de redimensionar elegantemente los componentes. Podría crear un LayoutManager personalizado que los escalaría linealmente, pero que probablemente se vería mal para la mayoría de los componentes.

EDITAR: Aquí hay una versión que podría ser útil:

public class LinearScaleLayout { public static void main(String[] args) { JFrame frame = new JFrame("Linear Scale Layout Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(100, 100, 200, 200); JPanel scalePanel = new JPanel(new LinearScaleLayoutManager()); scalePanel.setBorder(new EmptyBorder(5, 5, 5, 5)); scalePanel.add(new JTextField(), new Rectangle2D.Double(0, 0, 1, 0.2)); scalePanel.add(new JScrollPane(new JEditorPane()), new Rectangle2D.Double(0, 0.25, 0.45, 0.75)); scalePanel.add(new JSlider(), new Rectangle2D.Double(0.55, 0.25, 0.45, 0.75)); frame.getContentPane().add(scalePanel); frame.setVisible(true); } private static class LinearScaleLayoutManager implements LayoutManager2 { private final HashMap<Component, Rectangle2D> rectMap = new HashMap<Component, Rectangle2D>(); @Override public void layoutContainer(Container parent) { synchronized (parent.getTreeLock()) { Insets insets = parent.getInsets(); int clientWidth = parent.getWidth() - insets.left - insets.right; int clientHeight = parent.getHeight() - insets.top - insets.bottom; if (clientWidth > 0 && clientHeight > 0) { for (Component component : parent.getComponents()) { Rectangle2D rect = rectMap.get(component); if (rect != null) { component.setBounds(new Rectangle(insets.left + (int)(rect.getX() * clientWidth), insets.top + (int)(rect.getY() * clientHeight), (int)(rect.getWidth() * clientWidth), (int)(rect.getHeight() * clientHeight))); } } } } } @Override public void addLayoutComponent(Component comp, Object constraints) { rectMap.put(comp, (Rectangle2D)constraints); } @Override public void removeLayoutComponent(Component comp) { rectMap.remove(comp); } @Override public Dimension minimumLayoutSize(Container parent) { return new Dimension(0, 0); } @Override public Dimension preferredLayoutSize(Container parent) { return new Dimension(100, 100); } @Override public Dimension maximumLayoutSize(Container target) { return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); } @Override public void addLayoutComponent(String name, Component comp) { } @Override public float getLayoutAlignmentX(Container target) { return 0; } @Override public float getLayoutAlignmentY(Container target) { return 0; } @Override public void invalidateLayout(Container target) { } } }

Estoy escribiendo una biblioteca donde me pasan en un contenedor (generalmente JPanel)

y tiene una especificación xml para diferentes controles, sus ubicaciones, tamaño y otros atributos. Tengo que crear esos controles en tiempo de ejecución y agregarlos al componente. ¿Cuál es una buena manera de gestionar el cambio de tamaño del contenedor primario?