在 JTextArea 下插入图像 [英] Inserting an image under a JTextArea
问题描述
所以我试图在 JTextArea 下面插入一个图像,但我运气不佳,有人可以帮忙吗?基本上我要问的是是否有人可以帮助创建另一个这样做的类或子类.这是我的代码:
import java.awt.*;导入 javax.swing.*;公共课 t{私人 JFrame f;//主框架私人 JTextArea t;//文本区域私有 JScrollPane sbrText;//滚动文本区域的窗格私人 JButton btnQuit;//退出程序public t(){//构造函数//创建框架f = new JFrame("测试");f.getContentPane().setLayout(new FlowLayout());String essay = "测试";//在 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 = 新 JScrollPane(t);sbrText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);//创建退出按钮btnQuit = new JButton("退出");btnQuit.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){System.exit(0);} });}public void launchFrame(){//创建布局//将文本区域和按钮添加到框架f.getContentPane().add(sbrText);f.getContentPane().add(btnQuit);//当关闭按钮被点击时关闭f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//显示框f.pack();//根据组件的大小调整框架f.setSize(450,480);f.setResizable(false);f.setLocationRelativeTo(null);f.setVisible(true);}公共静态无效主(字符串参数[]){t gui = 新 t();gui.launchFrame();}
}
基本问题是 JTextArea
将在 paintComponent
中绘制它的背景和文本.>
最简单的解决方案是让JTextArea
透明,并接管绘制背景的控制权.
这个例子基本上是用背景色填充背景,绘制图像,然后调用super.paintComponent
来渲染文本.
import java.awt.BorderLayout;导入 java.awt.EventQueue;导入 java.awt.Graphics;导入 java.awt.Graphics2D;导入 java.awt.image.BufferedImage;导入 java.io.File;导入 java.io.IOException;导入 javax.imageio.ImageIO;导入 javax.swing.JFrame;导入 javax.swing.JScrollPane;导入 javax.swing.JTextArea;导入 javax.swing.UIManager;导入 javax.swing.UnsupportedLookAndFeelException;公共类 TransparentTextArea {公共静态无效主(字符串 [] args){新的透明文本区域();}公共透明文本区域(){EventQueue.invokeLater(new Runnable() {@覆盖公共无效运行(){尝试 {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()));框架.pack();frame.setLocationRelativeTo(null);frame.setVisible(true);}});}公共类 CustomTextArea 扩展 JTextArea {私有 BufferedImage 图像;公共自定义文本区域(){超级(20, 20);尝试 {image = ImageIO.read(new File("/Users/swhitehead/Dropbox/MegaTokyo/Miho_Small_02.png"));} catch (IOException ex) {ex.printStackTrace();}}@覆盖公共布尔 isOpaque() {返回假;}@覆盖受保护的无效paintComponent(图形g){Graphics2D g2d = (Graphics2D) g.create();g2d.setColor(getBackground());g2d.fillRect(0, 0, getWidth(), getHeight());如果(图像!= null){int x = getWidth() - image.getWidth();int y = getHeight() - image.getHeight();g2d.drawImage(image, x, y, this);}super.paintComponent(g2d);g2d.dispose();}}}
so I'm trying to insert an image underneath a JTextArea, but I havent had much luck, could anyone please help? Basically what I'm asking is if anybody could help make another class or subclass that does this. Heres my code:
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();
}
}
The basic issue is that JTextArea
will paint it's background and it's text within the paintComponent
.
The simplest solution is to make the JTextArea
transparent and take over the control of painting the background.
This example basically fills the background with the background color, paints the image and then calls super.paintComponent
to allow the text to be rendered.
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();
}
}
}
这篇关于在 JTextArea 下插入图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!