2015-12-09 39 views
0


我正在使用自定義佈局管理器的項目。我的目標是將所有組件旋轉180°。
我有一些由JFrame組成的屏幕。我也有一些LayoutHandler,它定義了一些佈局圖層。每個圖層都是LayerLayout的實例,它實現java.awt中的LayerManager2
該流程可能如下所示: 我有JFrame,它代表顯示。這個JFrame有一些默認的內容窗格。設置於由LayerHandler表示本contentPane的佈局中的應用:
JFrame +自定義LayoutManeger +使用Graphisc2D(自轉)

graphicalDisplayJFrame.getContentPane().setLayout(new LayerLayout(layerHandler));//graphicalDisplayJFrame is JFrame which represents the display 

的layerHandler只是某種程度上管理哪些是LayerLayouts從java.awt中implemetns LayerLayout2各層。所以它看起來像佈局佈局或任何它。我對創建自定義佈局並不熟悉。

那裏我有一個情況顯示創建的JFrame。

graphicalDisplayJPanel = new JPanel() { 
       @Override 
       protected void paintComponent(Graphics g) { 

        super.paintComponent(g); 

        g2d = (Graphics2D) g; 
        g2d.rotate(Math.PI, anchorx, anchory); //rotation 180° 
       } 

        @Override 
        public void paintChildren(Graphics g) { 
         super.paintChildren(g); 
         Graphics2D g2d2 = (Graphics2D) g; 
        g2d2.rotate(Math.PI, anchorx, anchory); 

        } 


      }; 






     graphicalDisplayJFrame = new JFrame(); //creation of JFrame 

graphicalDisplayJFrame.setContentPane(graphicalDisplayJPanel); //setting JFrame to apply rotation 

,第一部分應旋轉180°,但它並沒有,對graphicalDisplayJFrame甚至當我打電話重繪。但當我加上這個:

JLabel hwLabel = new JLabel("Hello world."); 
    hwLabel.setVisible(true); 
    graphicalDisplayJFrame.add(hwLabel); 

我造成奇怪的事情。 JFrame及其上的所有組件意外旋轉180°。但它唯一的靜態行爲,因爲有一些文本組件顯示,並且當它們改變了文本時,它再次以非旋轉方式呈現。
所以問題是爲什麼會發生這種情況?
如果我將它分爲兩​​部分:

a)爲什麼JFrame上的Graphics2D不會影響其內容窗格上的子組件。爲什麼只有在添加無意義的JLabel時才起作用,但它只是實驗導致了我想要的(=用右旋轉重繪)。

b)我應該可能以某種方式應用rotation =>類似於覆蓋在JFrame的contentPane上添加的每個組件上的paint方法。但我該怎麼做呢?上面描述的佈局處理程序僅僅是管理一堆佈局(可能是自定義佈局的圖層,它實現了java.awt中的LayoutManager2),它只是提供放置在佈局上的組件並將它們放在內容窗格中。所以這個問題應該可能是我想要實現我的自定義疼痛的地方,這意味着應用旋轉(這是代碼g2d.rotate(Math.PI,anchorx,anchory)的這一部分; //旋轉180°) 。我希望可以理解,我花了相當多的努力去理解哪裏可能是問題,並試圖找出解決方案,但其行爲真的很奇怪。所以我希望有更多經驗的人能夠幫助我擺脫困境,併爲我指明方向。

+0

我不認爲重量很大的組件會非常喜歡。 –

回答

0

您正在非常奇怪的點上應用旋轉。 Graphics2D.rotate()僅適用於繪製之後之後的旋轉調用,但是您的paint-overides旋轉之後調用超級。

至於爲什麼添加一個標籤導致旋轉,很難說不看整個代碼。可能是部分重繪的效果。

您應該不要修改要點如圖形轉換或圖形旋轉傳遞到您的繪畫方法。它可能會以意想不到的方式影響父組件,並且效果可能會根據JRE版本輕鬆更改。相反,創建一個新的圖形向下傳遞給你的孩子的組件:

@Override 
public void paintChildren(Graphics g) { 
    Graphics2D g2d = (Graphics2D) g.create(); 
    try { 
     g2d.rotate(Math.PI, anchorx, anchory); 
     super.paintChildren(g2d); 
    } finally { 
     g2d.dispose(); 
    } 
} 

這種方法保留原始圖形不變,至少允許父組件正常渲染。旋轉圖形仍然很棘手,可能會在渲染過程中產生意想不到的副作用,但至少這些效果現在被小心地限制在旋轉組件的子組件中。