1

Graphics2Dで画像を描画した半透明のJPanelを実装したJavaコードがあります。この画像は、JFrame全体に80%不透明な白い長方形を含むPNGです。次に、データを表示するためにJTextPaneを追加する必要があります(アプリパッケージBTWのカスタムフォントを使用するように設定しました)が、半透明にすることはできません。白い背景は不透明で(textPane.setOpaque(false);設定しても)、私のJFrameの透明度は少し役に立たない...Wichはクールではありません。

だから私は私を驚かせるこの白い背景を取り除く方法を探しています。

私は多くのグーグル検索をロールバックしましたが、私が見つけたものはすべて、JTextPaneの不透明度を設定するためのブール値でした。また、Graphics 2Dを使用して、カスタムJTextPaneを作成し、その背景をオーバーライドできることもわかりましたが、機能しませんでした...私はすでにこれらすべてを試しました。

public class MyWindow extends JFrame {

    private static class MyTextPane extends JTextPane {
         public MyTextPane() {
            super();

            setText("Hello World");
            setOpaque(false);
            setBackground(new Color(0,0,0,0));
         }

         @Override
         protected void paintComponent(Graphics g) {
            g.setColor(new Color(0, 0, 0, 0));
            g.fillRect(0, 0, getWidth(), getHeight());

            super.paintComponent(g);
         }
    }

    public static void main(String[] args) {

         MyTextPane textPane = new MyTextPane();

         JPanel panel = new JPanel() {

             private static final long serialVersionUID = 1L;

             @Override
                         protected void paintComponent(Graphics g) {
                              try {
                Image img = ImageIO.read(new File("images/bg.png"));
                g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
                              } catch (IOException e) {
                e.printStackTrace();
              }

                              if (g instanceof Graphics2D) {
                                final int R = 240;
                                final int G = 240;
                                final int B = 240;

                Paint p =
                    new GradientPaint(0.0f, 0.0f, new Color(R, G, B, 0),
                        0.0f, getHeight(), new Color(R, G, B, 0), true);
                Graphics2D g2d = (Graphics2D)g;
                g2d.setPaint(p);
                g2d.fillRect(0, 0, getWidth(), getHeight());
            }
        }
    };
    panel.add(textPane);
    setContentPane(panel);

    }

(Oracleの説明でJFrameを半透明にしました。ここにあります)ありがとうございます

4

2 に答える 2

4

これが私がこの種のアイデアにアプローチする方法です...

ここに画像の説明を入力してください

public class OverlayTextArea {

    public static void main(String[] args) {
        new OverlayTextArea();
    }

    public OverlayTextArea() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(new ImagePane());
                frame.setLayout(new BorderLayout());
                frame.add(new TransparentTextArea());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TransparentTextArea extends JTextArea {

        public TransparentTextArea() {
            setOpaque(false);
            setBorder(new CompoundBorder(new EmptyBorder(10, 10, 10, 10), new LineBorder(Color.LIGHT_GRAY)));
        }

        @Override
        protected void paintComponent(Graphics g) {
            g.setColor(new Color(255, 255, 255, 128));
            Insets insets = getInsets();
            int x = insets.left;
            int y = insets.top;
            int width = getWidth() - (insets.left + insets.right);
            int height = getHeight() - (insets.top + insets.bottom);
            g.fillRect(x, y, width, height);
            super.paintComponent(g);
        }

    }

    public class ImagePane extends JPanel {

        private BufferedImage background;

        public ImagePane() {
            try {
                background = ImageIO.read(new File("/path/to/background.img"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (background != null) {
                int x = (getWidth() - background.getWidth()) / 2;
                int y = (getHeight() - background.getHeight()) / 2;
                g.drawImage(background, x, y, this);
            }
        }

    }

}

フィードバック

  • 本当に電話する必要があります。そうsuper.paintComponentしないと、特に透明なコンポーネントを扱っている場合に、深刻な問題が発生する可能性があります。
  • paintXxx画像の読み込みなど、メソッド内で長時間実行されるタスクを実行しないでください。これらのメソッドは迅速に戻ることを目的としており、連続して複数回呼び出される場合があります...
于 2013-01-06T05:02:22.617 に答える
2

Nimbus L&Fで動作させるには:

jta.setOpaque(false);
jta.setBorder(BorderFactory.createEmptyBorder());
jta.setBackground(new Color(0,0,0,0));
于 2015-06-12T21:43:32.203 に答える