2011-06-23 12 views
15

Aby wyrównać mój JFrame od righ do lewej, używam:ustaw JFrame Orientacja od prawej do lewej!

setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 

ale to działa tylko wtedy, gdy używam następujące styl (dekoracja) w 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); 
     } 
    }); 
    } 
} 

enter image description here

, ale chcę, aby działało bez tej dekoracji. Jak rozwiązać ten problem?

EDIT:

@mre Chcę JFrame jak ten:

enter image description here

EDIT2:

ja naprawdę bardzo potrzebuję tego problemu, który zostanie ustalony, więc Oferuję 500+ tym, którzy dadzą taką ramkę JFrame (z WindowsLookAndFeel):

enter image description here

+0

@ Eng.Fouad, nie jestem pewien, czy rozumiem pytanie. Wygląda na to, że chcesz mieć nieskoronowaną 'JFrame' ... – mre

+0

@można zobaczyć aktualizację –

+1

@ Eng.Fouad, a następnie zamiast ładować wygląd i sposób działania platformy, nie ładuj określonego wyglądu i stylu, który chcesz używać? – mre

Odpowiedz

5

@ Eng.Fouad

tylko żart i ten ... ???

Substance L&F

Kod:

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() { 
    } 
} 
+0

Skąd mogę pobrać ten pakiet "org.pushingpixels.substance.api.skin"? –

+0

@ Eng.Fouad, który pochodzi ze starego i oryginalnego pakietu http://java.net/projects/substance/, ale w tym roku został rozwidlony i nadal nosi nazwę Insubstantial https://github.com/Insubstantial (dla najtrudniejszych zmian jakie masz używać invokeAndWait zamiast invokeLater http://stackoverflow.com/questions/6579087/gui-problem-with-java-substance-look-and-feel/6579925#6579925), tutaj jest przydatny almanach dla L & F http: // stackoverflow .com/questions/3954616/look-and-feel-in-java, JGoodies ma dobre implementacje dla CompoentOrientation, musisz spróbować, ponieważ nigdy nie potrzebowałem zmiany, która – mKorbel

+0

Czy mógłbyś krótko wyjaśnić, w jaki sposób mogę użyć tego pakietu? Nie jestem zaznajomiony z używaniem pakages. Dam ci replikę +50, ponieważ prawie wygasła i twoje rozwiązanie wydaje się być spełnione, co chcę –

1

Wygląda funkcji Orientacja składnik nie jest obsługiwane przez Windows LookAndFeel (przynajmniej nie na pasku tytułowym)

+2

pasek tytułu nie ma nic wspólnego z LAF - to dostarczone przez system operacyjny. Prawdą jest, że WindowsLAF nie obsługuje LAFDecoration (aka: zamiast używania domyślnej dekoracji okna OS, niech LAF przetasuje się) – kleopatra

3

Podejrzewam, że ma do czynienia bardziej z OS. Zwykle (jeśli nie dzwonisz pod numer setDefaultLookAndFeelDecorated), to system operacyjny zapewnia dekorację ramki, a nie LAF.

Powinieneś spróbować zmienić swoje preferencje w systemie operacyjnym, aby powiedzieć, że chcesz ustawić orientację od prawej do lewej.

Niestety, nie wiem, gdzie byłyby te ustawienia. Po wykonaniu tej czynności powinno być możliwe usunięcie połączenia z numerem setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); , ponieważ LAF pobierze ustawienia systemu operacyjnego z ustawień regionalnych.

EDIT

This Link opisuje jak włączyć lewo od prawej do tekstu na Windows 7. Następnie myślę będzie trzeba także change your locale.

1

Oto one posibility. To narzędzie jest przeznaczone dla użytkowników komputerów Mac, którzy przełączyli się na system Windows i chcą mieć przyciski okien po lewej stronie, ale powinny spełniać te same potrzeby, co Ty.

To rozwiązanie nie ma nic wspólnego z Javą (więc nie wiem, czy jest to do zaakceptowania dla twoich potrzeb) i brzmi, jakby było to zewnętrzne dla twojej aplikacji. Nie mogłem sam tego wypróbować (nie korzystam z systemu Windows), więc nie mogę ręczyć za to, ale warto spróbować.

+0

To działa dobrze, ale potrzebuję, żeby to działało wewnętrznie z moim programem –

7

Poniżej opisano, co można zaobserwować przez fragmencie kodu:

ComponentOrientation ma zastosowanie tylko do Swing (i AWT faktycznie) komponentów.

Podczas korzystania z JFrame.setDefaultLookAndFeelDecorated(true);, cała dekoracja ramki jest wykonywana przez Swing (w rzeczywistości sam LookAndFeel), więc działa zgodnie z oczekiwaniami.

Jeśli nie ustawisz tej opcji, oznacza to, że system operacyjny jest odpowiedzialny za dekorację ramki, jednak system operacyjny nie może być świadomy, że ComponentOrientation używany jest przez komponenty Swing!

Spodziewam się systemu operacyjnego (czy wspomniałeś, jaki system operacyjny jest używany dokładnie?) Wygląda na to, że Windows 7 ma rację?), Aby wykonać poprawną dekorację na podstawie aktualnie wybranego ustawienia Ustawienia regionalne. Dlatego jeśli masz ustawiony język arabski i wybrany w systemie operacyjnym, domyślam się, że wszystkie dekoracje okien są od prawej do lewej. Czy próbowałeś zmienić to ustawienie regionalne (za pomocą panelu sterowania "Region i język")? Zadziałało?

Uwaga: Nie sądzę, aby można było zmienić te ustawienia systemu operacyjnego bezpośrednio z poziomu Java, ale można je odczytać za pomocą Locale.getDefault().

Podsumowując:

  • przede wszystkim, trzeba upewnić się, że system operacyjny jest poprawnie skonfigurowany pod względem orientacji tekstu; przepraszam, nie mogę tu nic poradzić, ponieważ nie mam zainstalowanych języków pisanych od prawej do lewej na moim komputerze z Windows.

  • następnie użyj wygląd systemu i czuć i upewnić się, że JFrame.setDefaultLookAndFeelDecorated(false);

  • jeśli to nie zadziała, to może rozważyć opublikowania swojej fragment kodu, wraz z konfiguracji systemu do listy bugów Oracle Java

Poniżej znajdują się dodatkowe noty o tym, jak poprawić tę część kodu (ale nie jest to poprawka dla Twojego problemu)

B y sposób, jeśli pozwalają użytkownikowi określić swoje preferencje językowe OS, to nie powinien wyraźnie ciężko kod frame.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); ale raczej użyć czegoś takiego:

frame.applyComponentOrientation(
    ComponentOrientation.getOrientation(Locale.getDefault())); 

Gdzie Locale.getDefault(), chyba że wyraźnie zmieniła wewnątrz aplikacji, powróci aktualnie wybrany poziom OS Locale.

Należy również zauważyć, że lepiej jest używać applyComponentOrientation() niż setComponentOrientation(), ponieważ pierwszy rekursywnie ustawia daną orientację na całą hierarchię komponentów.

Wreszcie, będziesz musiał upewnić się w swoich oknach, że użyta LayoutManager jest od prawej do lewej; Zwykle jest to w porządku ze wszystkimi standardowymi układami Swing, ale nie dla wszystkich menedżerów układów zewnętrznych, jeśli ich używasz.

+0

Próbowałem 'applyComponentOrientation (ComponentOrientation.getOrientation (Locale.getDefault())); 'ale to nie działa: \ –

+0

Po pierwsze, czy możesz potwierdzić, że Twoje ustawienia regionalne są arabskie? Możesz dodać 'System.out.println (Locale.getDefault());' do swojego kodu, aby to potwierdzić. – jfpoilpret

+0

Wyjście: 'ar_SA' –

Powiązane problemy