2013-04-13 130 views
0

所以我试图在JTextArea下插入一个图像,但我没有很多运气,任何人都可以请帮忙吗?基本上我问的是,如果有人能够帮助创建另一个类或子类来做到这一点。我的继承人代码:在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(); 
    } 

}

+2

你可以看看[这](http://stackoverflow.com/questions/14152491/swing-graphics-on-jframe/14152568#14152568),这表明下paining JTextArea的文本 – MadProgrammer

回答

1

退房的Background Panel。向面板添加滚动窗格时,它将使滚动窗格,视口和文本区域都不透明,以便您可以看到图像。

1

基本问题是,JTextArea将绘制它的背景,它的文本在paintComponent内。

最简单的解决方案是使JTextArea透明并接管绘制背景的控制。

本示例基本上用背景色填充背景,绘制图像,然后调用super.paintComponent以允许呈现文本。

enter image description here

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(); 
     } 

    } 

} 
+0

对不起,这不是我正在寻找的。当我向后滚动时,图像停留在底部,即时寻找要在JTextArea下方的图像。 – user2278319

+0

定义“底部” – MadProgrammer

+0

如Photoshop图层或堆叠纸张。底部是JFrame,接下来是图片,然后顶部作为jtextarea – user2278319