2012-02-22 6 views
5

これは愚かなように見えるかもしれませんが(おそらくそれです)、JFrameのすべてのコンポーネントを逆さまにするにはどうすればいいですか? JFrameですべてが中途半端コントロールのテキストを含むJFrame上下軸を中心に上下反転しなければなりません。反転していても期待通りに好ましくJTextField秒、JButton Sなどでの作業。JFrameとその子を逆さまにする方法は?

私はいくつかの検索を行ってきましたが、その件に関して役に立つものは何も見つかりませんでした。

手動でレイアウトを変更し、使用された各コントロールのペイントメソッドを拡張したり上書きするより簡単な方法はありますか?

編集:私はそれを働かせることができました。 my answer belowが表示されます。

あなたは簡単にすべてのコンポーネントを変更することなくGUIを反転させることができ
+2

は* "単なるいたずらのためにあまりにも多くの努力?" *あなたは今まで考えがありますあなたの力を使用して..for ***良い?*** –

+0

逆さまにモニターの電源を入れ、またはあなたの頭の上に立つ方が簡単かもしれません。それは十分な嘲笑と娯楽を提供する場合は、グラフィックスカードの;-) – DNA

+0

多くは、あなたがデスクトップ全体(ではなく、個々のウィンドウ)を回転させるようになりますか? – DNA

答えて

2

小さな作業反転アプリケーションを作成することができました。これまで使用されていたすべての子コントロール(JTextAreaJLabelJButton)は、期待どおりに動作し、すべてのイベントが発生します。ここで

スクリーンショットです...

It's flipped!

とコード...

import java.awt.AWTEvent; 
import java.awt.BorderLayout; 
import java.awt.Cursor; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Toolkit; 
import java.awt.Window; 
import java.awt.event.MouseEvent; 
import java.awt.geom.AffineTransform; 
import java.awt.image.AffineTransformOp; 
import java.awt.image.BufferedImage; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JRootPane; 
import javax.swing.JTextArea; 
import javax.swing.RepaintManager; 
import javax.swing.SwingUtilities; 
import javax.swing.border.EmptyBorder; 

public class FlipUpsideDown { 

    public static void main(String[] args) { 
     JTextArea textArea = new JTextArea("This is a working text area\n\nI LOVE SWING", 4, 0); 
     // The cursor still use the wrong mouse position so... 
     textArea.setCursor(Cursor.getDefaultCursor()); 

     final JPanel mainPanel = new JPanel(new BorderLayout(5, 5)); 

     mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     mainPanel.add(new JLabel("A Normal Label"), BorderLayout.NORTH); 
     mainPanel.add(textArea, BorderLayout.CENTER); 
     mainPanel.add(new JButton("Hello World!"), BorderLayout.SOUTH); 

     // The root pane is responsible for drawing all the children of the 
     // frame. All the paint calls go through the root pane since dirty 
     // painting of individual controls are blocked (see below). So we can 
     // use the paint method of the root pane to flip the painted controls. 
     final JFrame f = new JFrame("FlipUpsideDown") { 

      protected JRootPane createRootPane() { 
       JRootPane rp = new JRootPane() { 

        public void paint(Graphics g) { 
         BufferedImage im = new BufferedImage(this.getWidth(), this.getHeight(), 
           BufferedImage.TYPE_3BYTE_BGR); 
         // Paint normally but on the image 
         super.paint(im.getGraphics()); 

         // Reverse the image 
         AffineTransform tx = AffineTransform.getScaleInstance(1, -1); 
         tx.translate(0, -im.getHeight()); 
         AffineTransformOp op = new AffineTransformOp(tx, 
           AffineTransformOp.TYPE_NEAREST_NEIGHBOR); 
         im = op.filter(im, null); 

         // Draw the reversed image on the screen 
         g.drawImage(im, 0, 0, null); 
        } 
       }; 
       rp.setOpaque(true); 
       return rp; 
      } 
     }; 

     // Override the RepaintManager so that we always repaint the entire 
     // frame when a region is set to dirty. 
     RepaintManager repaintManager = new RepaintManager() { 

      public void addDirtyRegion(JComponent c, int x, int y, int w, int h) { 
       schedulePaint(); 
      } 

      public void addDirtyRegion(Window window, int x, int y, int w, int h) { 
       schedulePaint(); 
      } 

      public void paintDirtyRegions() { 
       schedulePaint(); 
      } 

      private void schedulePaint() { 
       SwingUtilities.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         f.paint(f.getGraphics()); 
        } 
       }); 
      } 
     }; 
     RepaintManager.setCurrentManager(repaintManager); 

     // Intercept mouse events and flip their positions around in the JFrame 
     EventQueue queue = new EventQueue() { 

      protected void dispatchEvent(AWTEvent event) { 
       if (event instanceof MouseEvent) { 
        MouseEvent me = (MouseEvent) event; 
        MouseEvent evt = new MouseEvent(
          me.getComponent(), 
          me.getID(), 
          me.getWhen(), 
          me.getModifiers(), 
          f.getWidth() - me.getX() + f.getInsets().right - f.getInsets().left, 
          f.getHeight() - me.getY() + f.getInsets().top - f.getInsets().bottom, 
          me.getClickCount(), 
          false, 
          me.getButton()); 
        event = evt; 
       } 
       super.dispatchEvent(event); 
      } 
     }; 
     Toolkit.getDefaultToolkit().getSystemEventQueue().push(queue); 

     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLocationByPlatform(true); 
     f.add(mainPanel); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 
+0

RepaintManagerを使ってうまくやってみると、そんなことは考えられませんでした。 – ARRG

4

は、単にあなたの最上位のコンテナのpaintメソッドを変更します。

class ReversedPanel extends Component { 
    @Override 
    public void paint(Graphics g) { 
     BufferedImage im = new BufferedImage(this.getWidth(), this.getHeight(), 
       BufferedImage.TYPE_3BYTE_BGR); 
     // Paint normally but on the image 
     super.paint(im.getGraphics()); 

     // Reverse the image 
     AffineTransform tx = AffineTransform.getScaleInstance(1, -1); 
     tx.translate(0, -im.getHeight()); 
     AffineTransformOp op = new AffineTransformOp(tx, 
       AffineTransformOp.TYPE_NEAREST_NEIGHBOR); 
     im = op.filter(im, null); 

     // Draw the reversed image on the screen 
     g.drawImage(im, 0, 0, null); 
    } 
} 

錯覚は、しかし完璧ではない:ユーザーがオリジナルの上に置いたときボタンの位置は、ボタンが正しく表示されます。

明らかに、これはかなり複雑な逆転イベントを処理しません。

+0

あなたの答えをありがとう!これは、完全な作業例を作成する際の基礎となりました。イベントを逆転させて絵の問題を解決するのは本当に使命でしたが、私はそれを最終的に機能させることができました。 – ughzan

関連する問題