tamaño pasos para definir crear componentes componente como java swing layout jpanel layout-manager

pasos - tamaño de un panel java



JPanel y componentes cambian de posición automáticamente (1)

Hola, estoy trabajando en la aplicación de columpio pero estoy enfrentando un problema.

La primera vez que JPanel aplicación, JPanel se posicionó en la posición correcta, donde decidí configurar los componentes internos. Pero el problema ocurre cuando

jpanel y nuevamente jpanel ventana de marco jpanel cambia automáticamente su posición.

Abajo las imágenes muestran esa diferencia

Como podemos ver en los componentes de la segunda imagen, cambia su posición automáticamente.

Para esto escribí el siguiente código,

jpanel_addPurchase = new JPanel(); jpanel_addPurchase.setLayout(null); jpanel_addPurchase.setBounds(400, 0, 500, 500); jpanel_addPurchase.setBackground(Color.white); JLabel lbl_title = new JLabel("Purchase Form"); lbl_title.setBounds(90, 20, 100, 100); jpanel_addPurchase.add(lbl_title);

Y agregó este panel en el marco usando,

setContentPane(getJPanel());

Donde me estoy equivocando?


Creo que el diseño original (no roto) parece peculiar y dificultaría que el usuario final siga las filas y las etiquetas / campos. Sugiero usar un GroupLayout para alinear las etiquetas a la derecha, y alinear los campos que contienen los valores. Me gusta esto:

import java.awt.*; import java.util.HashMap; import java.util.Map; import javax.swing.*; class TwoColumnLayoutWithHeader { /** * Provides a JPanel with two columns (labels & fields) laid out using * GroupLayout. The arrays must be of equal size. * * Typical fields would be single line textual/input components such as * JTextField, JPasswordField, JFormattedTextField, JSpinner, JComboBox, * JCheckBox.. & the multi-line components wrapped in a JScrollPane - * JTextArea or (at a stretch) JList or JTable. * * @param labels The first column contains labels. * @param fields The last column contains fields. * @param addMnemonics Add mnemonic by next available letter in label text. * @return JComponent A JPanel with two columns of the components provided. */ public static JComponent getTwoColumnLayout( JLabel[] labels, JComponent[] fields, boolean addMnemonics) { if (labels.length != fields.length) { String s = labels.length + " labels supplied for " + fields.length + " fields!"; throw new IllegalArgumentException(s); } JComponent panel = new JPanel(); GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); // Turn on automatically adding gaps between components layout.setAutoCreateGaps(true); // Create a sequential group for the horizontal axis. GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup(); GroupLayout.Group yLabelGroup = layout.createParallelGroup(GroupLayout.Alignment.TRAILING); hGroup.addGroup(yLabelGroup); GroupLayout.Group yFieldGroup = layout.createParallelGroup(); hGroup.addGroup(yFieldGroup); layout.setHorizontalGroup(hGroup); // Create a sequential group for the vertical axis. GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup(); layout.setVerticalGroup(vGroup); int p = GroupLayout.PREFERRED_SIZE; // add the components to the groups for (JLabel label : labels) { yLabelGroup.addComponent(label); } for (Component field : fields) { yFieldGroup.addComponent(field, p, p, p); } for (int ii = 0; ii < labels.length; ii++) { vGroup.addGroup(layout.createParallelGroup(). addComponent(labels[ii]). addComponent(fields[ii], p, p, p)); } if (addMnemonics) { addMnemonics(labels, fields); } return panel; } private final static void addMnemonics( JLabel[] labels, JComponent[] fields) { Map<Character, Object> m = new HashMap<Character, Object>(); for (int ii = 0; ii < labels.length; ii++) { labels[ii].setLabelFor(fields[ii]); String lwr = labels[ii].getText().toLowerCase(); for (int jj = 0; jj < lwr.length(); jj++) { char ch = lwr.charAt(jj); if (m.get(ch) == null && Character.isLetterOrDigit(ch)) { m.put(ch, ch); labels[ii].setDisplayedMnemonic(ch); break; } } } } /** * Provides a JPanel with two columns (labels & fields) laid out using * GroupLayout. The arrays must be of equal size. * * @param labelStrings Strings that will be used for labels. * @param fields The corresponding fields. * @return JComponent A JPanel with two columns of the components provided. */ public static JComponent getTwoColumnLayout( String[] labelStrings, JComponent[] fields) { JLabel[] labels = new JLabel[labelStrings.length]; for (int ii = 0; ii < labels.length; ii++) { labels[ii] = new JLabel(labelStrings[ii]); } return getTwoColumnLayout(labels, fields); } /** * Provides a JPanel with two columns (labels & fields) laid out using * GroupLayout. The arrays must be of equal size. * * @param labels The first column contains labels. * @param fields The last column contains fields. * @return JComponent A JPanel with two columns of the components provided. */ public static JComponent getTwoColumnLayout( JLabel[] labels, JComponent[] fields) { return getTwoColumnLayout(labels, fields, true); } public static String getProperty(String name) { return name + ": /t" + System.getProperty(name) + System.getProperty("line.separator"); } public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { JComponent[] components = { new JTextField(15), new JTextField(10), new JTextField(8), new JSpinner(new SpinnerNumberModel(1,0,10,1)), new JSpinner(new SpinnerNumberModel(9.95,0d,100d,.01)), new JSpinner(new SpinnerNumberModel(9.95,0d,1000d,.01)), new JSpinner(new SpinnerNumberModel(9.95,0d,100d,.01)), new JSpinner(new SpinnerNumberModel(9.95,0d,1000d,.01)), new JSpinner(new SpinnerNumberModel(9.95,0d,100d,.01)), new JSpinner(new SpinnerNumberModel(9.95,0d,1000d,.01)) }; String[] labels = { "Product Name:", "Product Unit Name:", "Purchase Date:", "Quantity:", "Price Per Unit:", "Total Price:", "Discount:", "Total:", "VAT:", "Grand Total:" }; JComponent labelsAndFields = getTwoColumnLayout(labels,components); JComponent orderForm = new JPanel(new BorderLayout(5,5)); orderForm.add(new JLabel("Purchase Form", SwingConstants.CENTER), BorderLayout.PAGE_START); orderForm.add(labelsAndFields, BorderLayout.CENTER); JOptionPane.showMessageDialog(null, orderForm); } }; // Swing GUIs should be created and updated on the EDT // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html SwingUtilities.invokeLater(r); } }