El uso de diferentes diseños de interfaces gráficas de usuario
-
22-09-2019 - |
Pregunta
Esto es lo que mi programa debe ser similar y yo soy un poco confundido sobre donde debería utilizar diferentes diseños.
Tengo una clase de ventana, que llama a la clase y la clase Panel Panel llama a las clases InputPanel y DisplayPanel. Mi clase InputPanel llama mis clases DetailsPanel, CrimePanel y ButtonPanel por lo que constituyen lo que se ve en la pestaña de entrada. Me dijeron que para usar un BorderLayout para toda la ventana, y que el DetailsPanel (panel izquierdo) y CrimePanel debería ser GridLayout.
¿Esto significa que debe:
- Coloque el código BorderLayout en el panel y el código GridLayout en CrimePanel y DetailsPanel o
- Poner el código BorderLayout en la ventana y el código GridLayout en el Panel?
alt text http://img137.imageshack.us/img137/6422/93381955 .jpg
Solución
De acuerdo, su descripción es un poco complicado (o todavía estoy demasiado cansado hoy o no tienen suficiente cafeína aún). Su noción de "llamar" clases de paneles de otros también es un poco raro.
Pero por lo que yo puedo ver, su primera opción es la correcta.
En general que acaba de nido de los objetos en tiempo de ejecución, por lo que podría parecer un poco como la siguiente:
InputPanel (has BorderLayout)
+--DetailsPanel (put in BorderLayout.WEST; has GridLayout)
| +--nameLabel
| +--nameTextField
| +--...
+--CrimePanel (put in BorderLayout.NORTH; has GridLayout)
| +--murderRadioButton
| +--arsonRadioButton
| +--...
+--ButtonPanel (put in BorderLayout.CENTER; has GridLayout)
+--button
Por lo general, hacer esto en el constructor de la clase correspondiente:
public class InputPanel {
public InputPanel() {
this.setLayout(new BorderLayout());
this.add(new DetailsPanel(), BorderLayout.WEST);
this.add(new CrimePanel(), BorderLayout.NORTH);
this.add(new ButtonPanel(), BorderLayout.CENTER);
}
}
public class DetailsPanel {
JLabel nameLabel;
JTextField nameField;
// ...
public DetailsPanel() {
this.setLayout(new GridLayout(5, 1));
nameLabel = new JLabel("Name");
nameField = new JTextField();
// ...
this.add(nameLabel);
this.add(nameField);
// ...
}
}
...
Sin embargo, veo un pequeño problema aquí: Desde GridLayout
no permite a los componentes abarcan múltiples columnas puede que tenga que anidan otros paneles en el DetailsPanel
de la izquierda también. Usted puede conseguir lejos con un solo GridBagLayout
que tiene las capacidades necesarias, o anida otros paneles de allí:
DetailsPanel (has BorderLayout)
+--panel1 (has GridLayout with 2 rows, 1 column; put in BorderLayout.NORTH)
| +--nameLabel
| +--nameField
+--panel2 (has GridLayout with 3 rows, 2 columns; put in BorderLayout.CENTER)
+--dayField
+--dayLabel
+--monthField
+--...
Otros consejos
A partir de su descripción, la opción 1 debería funcionar. Dar la entrada JPanel
un BorderLayout
, con los detalles, la delincuencia y la JPanel
s botón (ubicado en el oeste, norte y sur, respectivamente) que tienen GridLayout
s.
En primer lugar tendrá que poner un JTabbedPane en la ventana para contener sus dos pestañas (entrada y de salida), cada uno consistente en un JPanel.
El panel de entrada podría ser subdividido usando un BorderLayout como describe Joannes; otra alternativa es el GroupLayout introdujo en Java 6, que es muy potente, pero difícil de envolver su alrededor mente. Podría ser utilizado a la disposición en la ficha entera en un solo panel.