Orientation JFrame de droite à gauche!
setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
mais cela ne fonctionne que si j'utilise le style (décoration) suivant de la JFrame:
public class RightToLeft {
public static void main(String []args){
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run() {
try { UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); }
catch (Exception e) { e.printStackTrace(); }
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("العنوان بالعربي");
frame.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
frame.setSize(300,300);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
<!-Mais je veux que ça marche sans cette décoration. Comment résoudre ce problème?
EDIT:
<!-Je veux un JFrame comme celui-ci:EDIT2:
je suis vraiment j'ai besoin que ce problème soit résolu, donc j'offre 500+ à qui donnera un JFrame comme celui-ci (avec WindowsLookAndFeel):
6 réponses
@Eng.Fouad
juste une blague et celle-ci ???...
code:
import java.awt.ComponentOrientation;
import javax.swing.JFrame;
import javax.swing.UIManager;
import org.pushingpixels.substance.api.skin.SubstanceOfficeSilver2007LookAndFeel;
public class RightToLeft {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
//UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
UIManager.setLookAndFeel(new SubstanceOfficeSilver2007LookAndFeel());
} catch (Exception e) {
e.printStackTrace();
}
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("العنوان بالعربي");
frame.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
});
}
private RightToLeft() {
}
}
ce qui suit explique ce que vous observez à travers votre extrait de code:
ComponentOrientation
ne s'applique qu'aux composants Swing (et AWT en fait).
en utilisant JFrame.setDefaultLookAndFeelDecorated(true);
, Puis toute la décoration du cadre est réalisée par Swing (le LookAndFeel lui-même en fait), donc cela fonctionne comme prévu.
si vous ne définissez pas cette option cependant, cela signifie que L'OS est en charge de la décoration du cadre, cependant L'OS ne peut pas être conscient de la ComponentOrientation
utilisé par vos composants Swing!
j'attends de l'OS (avez-vous mentionner l'OS que vous utilisez exactement? Il semble être Windows 7 droit?) pour effectuer la bonne décoration basée sur le actuellement sélectionné Locale. Par conséquent, si vous avez une configuration locale arabe et sélectionnée sur votre OS, je suppose que toutes les décorations de windows sont à droite à gauche. Avez-vous essayé de changer ce lieu (via le panneau de contrôle "région et langue")? Fait-il?
Remarque: je ne pense pas que vous pouvez modifier ces paramètres D'OS directement depuis Java, mais vous pouvez les lire avec Locale.getDefault()
.
Pour résumer:
tout d'abord, vous devez vous assurez-vous que votre système D'exploitation est correctement configuré en termes d'orientation du texte; désolé Je ne peux pas vous aider beaucoup ici parce que je n'ai pas de langue droite-à-gauche installée sur ma machine Windows.
ensuite, utilisez l'apparence du système et assurez-vous que
JFrame.setDefaultLookAndFeelDecorated(false);
si cela ne fonctionne pas, alors vous pouvez envisager de poster votre code snippet, ainsi que votre configuration système vers la liste des bogues Java D'Oracle
Ce qui suit sont des notes supplémentaires sur la façon d'améliorer cette partie de ton code (mais ce n'est pas une solution pour votre problème)
soit dit en passant, si vous laissez l'utilisateur définir ses préférences de langage OS, alors vous ne devriez pas explicitement le code dur frame.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
mais plutôt d'utiliser quelque chose comme:
frame.applyComponentOrientation(
ComponentOrientation.getOrientation(Locale.getDefault()));
Où Locale.getDefault()
, à moins qu'il ne soit explicitement modifié dans votre application, retournera le niveau OS actuellement sélectionné Locale
.
notez Également qu'il est préférable d'utiliser applyComponentOrientation()
plutôt que setComponentOrientation()
, parce que la première règle récursivement l'orientation donnée à l'ensemble de la hiérarchie des composants.
enfin, vous devrez vous assurer dans vos fenêtres que le LayoutManager
utilisé est de droite à gauche; ce qui est normalement OK avec tous les mises en page Swing standard, mais pas pour tous les gestionnaires de mise en page tiers, si vous utilisez certains.
je soupçonne qu'il doit faire plus avec le système D'exploitation. Normalement (si vous ne l'appelez pas setDefaultLookAndFeelDecorated
) c'est L'OS qui fournit la décoration du cadre, pas le LAF.
vous devriez essayer de changer vos préférences dans L'OS pour dire que vous voulez l'orientation de droite à gauche.
Désolé, je ne sais pas où ces réglages.
Une fois que vous faites cela, alors vous devriez être en mesure de supprimer l'appel à setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
comme le LAF va prendre les paramètres du système d'exploitation de la Paramètres régionaux.
EDIT
Ce Lien décrit comment activer le texte de droite à gauche sur Windows 7. Ensuite, J'Ai penser vous aussi, vous avez besoin d' changez de lieu.
on dirait que la fonctionnalité D'Orientation des composants N'est pas supportée avec le LookAndFeel Windows (du moins pas pour la barre de titre)
Ici une possibilité. Cet utilitaire est conçu pour les utilisateurs Mac qui ont commuté à Windows et veulent les boutons de fenêtre sur la gauche, mais il devrait servir les mêmes besoins que le vôtre.
Cette solution n'a rien à voir avec Java (donc je ne sais pas si elle est même acceptable pour vos besoins) et semble être externe à votre application. Je n'ai pas pu l'essayer moi-même (je n'exécute pas Windows), donc je ne peux pas me porter garant pour elle, mais il pourrait être la peine d'une essayer.
il suffit d'ajouter cette ligne de code et je suis sûr qu'elle fonctionne à 100%.
frame.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);