我正在使用自定義佈局管理器的項目。我的目標是將所有組件旋轉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°) 。我希望可以理解,我花了相當多的努力去理解哪裏可能是問題,並試圖找出解決方案,但其行爲真的很奇怪。所以我希望有更多經驗的人能夠幫助我擺脫困境,併爲我指明方向。
我不認爲重量很大的組件會非常喜歡。 –