0

JTextAreaの下に画像を挿入しようとしていますが、あまり運がありません。誰か助けてください。基本的に私が求めているのは、誰かがこれを行う別のクラスまたはサブクラスを作成するのを手伝ってくれるかどうかです. 私のコードは次のとおりです。

import java.awt.*;
import javax.swing.*;


public class t{
    private JFrame f; //Main frame
    private JTextArea t; // Text area   private JScrollPane sbrText; // Scroll pane for text area
    private JButton btnQuit; // Quit Program

    public t(){ //Constructor
        // Create Frame
        f = new JFrame("Test");         
        f.getContentPane().setLayout(new FlowLayout());         
        String essay = "Test"; 
        // Create Scrolling Text Area in Swing
        t = new JTextArea(essay, 25, 35);
        t.setEditable(false); 
        Font f = new Font("Verdana", Font.BOLD, 12 );
        t.setFont( f );         
        t.setLineWrap(true);        
        sbrText = new JScrollPane(t);
        sbrText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
                // Create Quit Button
        btnQuit = new JButton("Quit");
        btnQuit.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    System.exit(0);         
                }           }       );
    }


    public void launchFrame(){ // Create Layout
        // Add text area and button to frame 
       f.getContentPane().add(sbrText);
        f.getContentPane().add(btnQuit);
                 // Close when the close button is clicked
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Display Frame
        f.pack(); // Adjusts frame to size of components
        f.setSize(450,480);
        f.setResizable(false);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String args[]){
        t gui = new t();     
        gui.launchFrame();
    } 

}

4

2 に答える 2

2

基本的な問題は、そのJTextArea背景と .xml 内のテキストを描画することpaintComponentです。

最も簡単な解決策は、JTextArea透明にして背景の描画を制御することです。

この例では基本的に、背景を背景色で塗りつぶし、画像をペイントしてsuper.paintComponentから、テキストをレンダリングできるように呼び出します。

ここに画像の説明を入力

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TransparentTextArea {

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

    public TransparentTextArea() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(new CustomTextArea()));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class CustomTextArea extends JTextArea {

        private BufferedImage image;

        public CustomTextArea() {
            super(20, 20);
            try {
                image = ImageIO.read(new File("/Users/swhitehead/Dropbox/MegaTokyo/Miho_Small_02.png"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public boolean isOpaque() {
            return false;
        }

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(getBackground());
            g2d.fillRect(0, 0, getWidth(), getHeight());
            if (image != null) {
                int x = getWidth() - image.getWidth();
                int y = getHeight() - image.getHeight();
                g2d.drawImage(image, x, y, this);    
            }
            super.paintComponent(g2d);
            g2d.dispose();
        }

    }

}
于 2013-04-13T22:26:50.327 に答える
1

背景パネルをご覧ください。スクロールペインをパネルに追加すると、スクロールペイン、ビューポート、およびテキスト領域がすべて不透明になるため、画像を見ることができます。

于 2013-04-13T21:11:17.360 に答える