2010-04-16 22 views
7

Estoy usando miglayout para crear un formulario en el que hay JTextFields (respuestas de entrada cortas), así como JTextAreas (respuestas más largas). El problema es doble.Swing: ¿cómo mezclar JTextField y JTextAreas y tener la misma apariencia visual?

  1. El borde colocado alrededor de un área de texto envolvente no coincide con el de un campo de texto.
  2. El ancho y la ubicación del textarea/textfield difieren, lo que hace que no se alineen correctamente.

alt text http://grab.by/3O0V

Después de cambiar de derecha/izquierda a derecha/llenado: alt text http://grab.by/3RMk se puede ver que los límites se alinean, pero que todavía hay lagunas. Traté de configurar novisualpadding, pero esto no lo solucionó. código

Fuente:

package test2; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import net.miginfocom.swing.MigLayout; 

public class Test extends JPanel { 

private static final int NUM_CHARACTERS_WIDTH = 20; 
private static final int NUM_ROWS = 5; 
public Test() { 

    setLayout(new MigLayout(
      "wrap 2", 
      // Align text labels on the so their right edge meets left edge of the text fields 
      "[right][left]" 
      )); 

    add(new JLabel("Text field:")); 
    add(new JTextField(NUM_CHARACTERS_WIDTH)); 

    add(new JLabel("No scrollpane text area:")); 
    add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)); 

    add(new JLabel("Scrollpane text area:")); 
    add(new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH))); 

    add(new JLabel("Text field:")); 
    add(new JTextField(NUM_CHARACTERS_WIDTH)); 

} 


public static void main(String[] args) { 
    JFrame frame = new JFrame(""); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel panel = new Test(); 
    frame.add(panel); 
    frame.pack(); 
    frame.setVisible(true); 
} 

}

¿Cuál es la mejor forma de mezclar y JTextField partido y jtextareas, mientras que todavía mantiene la armonía visual? Ahora me doy cuenta de que el campo de texto tiene un resaltado azul cuando el foco está en él, a diferencia del área de texto ... otra fuente de discontinuidad visual.

Respuesta

0

La respuesta es que la gente de MiG Layout es working on a fix for their next version.

Hola,

Apple tiene una desagradable habito de compensar por defecto y no dejar que el desarrollador decidir. Este es un caso en el que han agregado un borde para que sea más parecido visualmente al OS X. Esta debería ser la elección del administrador de diseño ...

MigLayout puede compensar los límites visuales como este pero solo se hace para JTabbedPane en Windows XP. Sin embargo, no estoy seguro de que se pueda hacer 100% bien en OS X. Tendré que verificar. No queremos que el campo de texto simplemente crezca dentro de los límites.

Lo he agregado a la lista de tareas para la próxima versión.

3

No estoy seguro de cómo puede solucionar su problema de borde, pero para arreglar su situación de disposición solo usaría springlayout. Springlayout es solo una forma de diseñar mejor sus elementos dentro de JPanel. Puede encontrar más información al respecto Java Sun Tutorial

Específicamente la usa estableciendo dónde desea que estén los bordes norte, sur, oeste y este de cada elemento. Para hacer esto, primero debe sacar sus llamadas de etiqueta del agregado para que cada una pueda ser nombrada. Así que en lugar de:

add(new JLabel("Text field:")); 

Do:

JLabel myLabelName = new JLabel("Text field:"); 
add(myLabelName); 

Para cada uno de sus elementos (JLabels, JTextAreas y JTextField). Una vez hecho esto, puede establecer fácilmente el diseño.

Springlayout layout = new SpringLayout(); 
setLayout(layout); 

Luego, para cada uno de los elementos, debe configurar cualquiera de los bordes que desee. Deben estar en el orden específico Sur, Norte, Oeste y Este. Aunque no tienes que usar los cuatro bordes si no quieres. Aquí hay un ejemplo de cómo configurar su primer área de texto, la que está en la parte superior.

layout.putConstraint(SpringLayout.NORTH, FirstTextAreaName, 10, SpringLayout.NORTH, this); 
layout.putConstraint(SpringLayout.WEST, FirstTextAreaName, this.getWidth()/2, SpringLayout.WEST, this); 
layout.putConstraint(SpringLayout.EAST, FirstTextAreaName, -10, SpringLayout.EAST, this); 

Este ejemplo no establece el sur del área de texto, pero si lo desea, tendría que ser el primero. La primera línea establece que el lado norte del área de texto esté a 10 píxeles de la parte superior. Al configurar las otras áreas que aunque las áreas anteriores (arriba) nombre en lugar de esto y dicen que es 10 píxeles de distancia del sur de la anterior:

layout.putConstraint(SpringLayout.NORTH, SecondTextAreaName, 10, SpringLayout.SOUTH, FirstTextAreaName); 

La segunda línea en el ejemplo anterior establece el lado este del área de texto para comenzar a la mitad de su panel principal. La última, tercera línea, establece que el lado este del área de texto esté a 10 píxeles del lado este del panel principal.

2

Para el problema de diseño, intente con un valor columnConstraints de [right][fill] en lugar de [right][left].

Para el otro problema, esto parece ser una incoherencia de apariencia. Ejecuté su código en Windows, y las diferencias también están ahí, pero menos flagrantes. Mi sugerencia sería establecer fronteras de identificación explícitamente para campos de texto y áreas de texto.

setLayout(new MigLayout(
     "wrap 2", 
     "[right][fill]" 
     )); 

JTextField textField; 
JScrollPane scrollPane; 

add(new JLabel("Text field:")); 
textField = new JTextField(NUM_CHARACTERS_WIDTH); 
textField.setBorder(new EtchedBorder(EtchedBorder.LOWERED)); 
add(textField); 

add(new JLabel("No scrollpane text area:")); 
add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)); 

add(new JLabel("Scrollpane text area:")); 
scrollPane = new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)); 
scrollPane.setBorder(new EtchedBorder(EtchedBorder.LOWERED)); 
add(scrollPane); 

add(new JLabel("Text field:")); 
textField = new JTextField(NUM_CHARACTERS_WIDTH); 
textField.setBorder(new EtchedBorder(EtchedBorder.LOWERED)); 
add(textField); 

Identicial borders http://img412.imageshack.us/img412/6341/clipboard01jl.png

Si no se puede conseguir MigLayout para alinear sus componentes, teniendo en cuenta el uso de java.awt.GridBagLayout:

import static java.awt.GridBagConstraints.*; 

setLayout(new GridBagLayout()); 

GridBagConstraints leftCons = new GridBagConstraints(); 
leftCons.anchor = NORTHEAST; 
leftCons.fill = NONE; 
leftCons.weightx = 1.0; 
leftCons.gridy = RELATIVE; 
leftCons.gridx = 0; 
leftCons.insets = new Insets(4, 8, 4, 8); 

GridBagConstraints rightCons = new GridBagConstraints(); 
rightCons.anchor = NORTHWEST; 
rightCons.fill = HORIZONTAL; 
rightCons.weightx = 1.0; 
rightCons.gridy = RELATIVE; 
rightCons.gridx = 1; 
rightCons.insets = leftCons.insets; 

add(new JLabel("Text field:"), leftCons); 
add(new JTextField(NUM_CHARACTERS_WIDTH), rightCons); 

add(new JLabel("No scrollpane text area:"), leftCons); 
add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH), rightCons); 

add(new JLabel("Scrollpane text area:"), leftCons); 
add(new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)), rightCons); 

add(new JLabel("Text field:"), leftCons); 
add(new JTextField(NUM_CHARACTERS_WIDTH), rightCons); 
+0

El [fill] ayuda. Sin embargo, el tamaño aún no es perfecto en Mac OSX: http://grab.by/3O9U – I82Much

+1

Tal vez una alternativa más adaptable sea adoptar el borde preferido de un tipo de componente y aplicarlo al otro; por ejemplo, textField.setBorder (scrollPane.getBorder()). –

+0

Considera probar java.awt.GridBagLayout. Vea mi respuesta enmendada para más código. –

2

Sé que MiGLAyout (que me encanta, por cierto) tiene la capacidad de hacer un manejo especial para la alineación visual frente a la alineación estricta de píxeles. Puede que te encuentres con esto ... El identificador de la unidad 'al' se usa para esto, pero no he tenido que usarlo, así que no puedo dar ejemplos. Probablemente valga la pena descargar el proyecto de muestra MiG y ver si tienen el mismo problema de alineación (estoy seguro de que tienen paneles similares al suyo).

Por lo que vale la pena, mezclamos los campos de texto y áreas en el mismo panel con bastante frecuencia y no se opongan a esta ... Nos hacemos tienen que establecer la frontera del panel de desplazamiento a ser el mismo que el borde del campo de texto como lo sugiere Noel Ang.

Además, en lugar de especificar restricciones en el constructor de diseño, por lo general especificarlos a medida que añadimos cada componente - no estoy seguro si eso hace la diferencia o no ...

0

En primer lugar 1 de capturas de pantalla. Como está utilizando Mac, ¿intentó con Quaqua Look And Feel? Representa los cuadros de texto/áreas correctamente.

4

Sé que esta pregunta es bastante viejo, pero para llegar a la frontera para una TextArea para que coincida con la de un TextField:

(myTextArea).setBorder(new TextField().getBorder()); 

que debe dar un borde a su TextArea como la que alrededor de un TextField .

+0

¡Bonito! Pero debería ser "new JTextField(). GetBorder()" –

Cuestiones relacionadas