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);
}
}