8
votes

Swing - Comment mélanger Jtextfield et JTextareas et avoir la même apparence visuelle?

J'utilise MIGLAYOUT pour créer un formulaire dans lequel il existe JTextfields (réponses d'entrée courtes) ainsi que JTextareas (réponses plus longues). Le problème est double.

  1. La frontière placée autour d'une zone de texte enveloppée de ScrollPane ne correspond pas à celle d'un champ de texte.
  2. La largeur et la mise en place du tissu Texarea / Textfield diffèrent, ce qui leur permet de ne pas aligner correctement.

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

    Après avoir changé de droite / de gauche à droite / remplir: texte alt http://grab.by/3rmk Vous pouvez voir que les limites s'alignent, mais qu'il y a toujours des lacunes. J'ai essayé de définir novisualpadding, mais cela ne l'a pas résolu.

    code source: xxx

    }

    Quel est le moyen préféré de mélanger et Match Jtextfield et JTextareas, tout en conservant une harmonie visuelle? Je remarque maintenant que le champ de texte a une surbrillance bleue autour de celle-ci lorsque la mise au point est comprise, par opposition à la zone de texte ... une autre source de discontinuité visuelle.


0 commentaires

6 Réponses :


3
votes

Vous ne savez pas comment vous pouvez corriger votre problème de frontière, mais pour réparer votre situation de mise en page, j'utiliserais simplement SpringLayout. SpringLayout est juste un moyen de mieux mettre en page vos éléments dans le JPanel. Vous pouvez en savoir plus sur Tutoriel Java Sun

Spécifiquement, vous l'utilisez en réglant l'endroit où vous souhaitez que vos frontières nord, sud, ouest et est de chaque élément. Pour ce faire, vous devriez d'abord prendre vos appels d'étiquettes de l'ajout de chaque que chacun peut être nommé. Donc, au lieu de: xxx

faire: xxx

pour chacun de vos éléments (jlabels, jtextareas et jtextfield). Une fois que cela est fait, vous pouvez facilement définir la mise en page. xxx

puis pour chacun des éléments que vous devez définir l'une des frontières souhaitées. Ils doivent être dans l'ordre spécifique sud, le nord, l'ouest puis vers l'est. Bien que vous n'ayez pas à utiliser les quatre frontières si vous ne le souhaitez pas. Voici un exemple sur la manière de définir votre première zone de texte, celle sur le dessus. xxx

Cet exemple ne règle pas le sud de la zone de texte, mais si vous l'avez fait. vouloir qu'il devrait être d'abord. La première ligne définit le côté nord de la zone de texte pour être de 10 pixels à l'écart du haut. Lors de la réglage des autres zones, mais du nom des zones précédentes (ci-dessus) au lieu de cela et dites qu'il est à 10 pixels du sud de la précédente: xxx

la deuxième ligne Dans l'exemple ci-dessus, définit le côté est de la zone de texte pour démarrer à mi-chemin de votre panneau principal. Le dernier, troisième, ligne définit le côté est de la zone de texte à 10 pixels du côté est de votre panneau principal.


0 commentaires

2
votes

Pour le problème de la mise en page, essayez un ColumrumnConstraints code> de [droite] [Remplir] [Remplir] code> au lieu de [à droite] code>. Pour l'autre problème, cela semble être une incohérence et une impression de sensation. J'ai couru votre code dans Windows et les différences sont là aussi, mais moins flagrant. Ma suggestion serait de définir des frontières identifiques explicitement pour les champs de texte et les zones de texte. P> xxx pré>

 frontières identiques p>

Si vous ne pouvez pas obtenir MIGLAYOUT pour aligner vos composants, envisagez d'utiliser Java.Awt.GridBagLayout: P>

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


3 commentaires

Le [remplissage] aide. Cependant, la taille n'est toujours pas parfaite sur Mac OSX: Grab.by/3o9u


Peut-être une alternative plus adaptable consiste à adopter la bordure préférée d'un type de composant et à l'appliquer à l'autre; E.G., TextField.SetBorder (ScrollPane.getborder ()).


Pensez à donner java.awt.gridbaglayout un essai. Voir ma réponse modifiée pour plus de code.



2
votes

Je sais que Miglayout (que j'aime, BTW) a la capacité de faire une manipulation spéciale pour alignement visuel vs alignement de pixels strict. Vous pouvez courir dans cette ... L'identifiant de l'unité «al» est utilisé pour cela, mais je n'ai pas eu à l'utiliser, vous ne pouvez donc pas fournir des exemples. Il serait probablement intéressant de télécharger le projet d'exemple de MIG et de voir s'ils ont le même problème d'alignement (je suis sûr qu'ils ont des panneaux similaires à la vôtre).

Pour ce que ça vaut la peine, nous mélangons des champs de texte et des zones dans le même panneau assez souvent et ne rencontrent pas cela ... nous do doivent définir la bordure du volet de défilement pour être la même chose que la bordure du champ de texte comme suggérée par Noel Ang.

Aussi, au lieu de spécifier des contraintes dans le constructeur de layout, nous les spécifions généralement comme nous ajoutons chaque composant - pas sûr si cela fait une différence ou non ...


0 commentaires

0
votes

premier off +1 pour les coups d'écran. Depuis que vous utilisez Mac, avez-vous essayé Quaqua Regard et ressentez-vous? Il rend les zones de texte / zones correctement.


0 commentaires

0
votes

La réponse est que les gens de la mise en page MIG sont Travailler sur un Corrigez-vous pour leur prochaine version .

Bonjour,

Apple a un habit méchant de compenser par défaut et ne laissez pas le développeur décider. Ceci est un tel cas où ils ont ajouté une bordure pour le rendre plus visuellement comme le système d'exploitation X. Cela devrait être le choix du gestionnaire de mise en page ...

MIGLAYOUT peut compenser les limites visuelles comme celle-ci, mais elle n'est faite que pour Jtabbedpane dans Windows XP. Je ne suis pas sûr que cela puisse être fait à 100% bien dans OS X. Je vais devoir vérifier. Nous ne voulons pas que le champ de texte se développe simplement dans les limites.

J'ai ajouté ceci à la liste TODO pour la prochaine version.


0 commentaires

8
votes

Je sais que cette question est assez ancienne, mais pour obtenir la frontière pour un textarea pour correspondre à celui d'un textfield : xxx

Cela devrait donner une bordure à votre textarea comme celui autour d'un Textfield .


1 commentaires

Joli! Mais il devrait être "nouveau jtextfield (). Getferder ()"