【发布时间】:2014-03-04 22:23:34
【问题描述】:
我正在自己开发一个项目,并希望创建一个看起来像链接中提供的屏幕截图的 JComponent 或 JFrame(因为这里说我没有足够的声誉来发布图像)。 JTextPane 被三张图片包围,它确实将单词换行到下一行。
所以请帮助我。如果你能用一个例子来证明你的答案,我将不胜感激。 这是图片的链接。
布局
截屏
【问题讨论】:
我正在自己开发一个项目,并希望创建一个看起来像链接中提供的屏幕截图的 JComponent 或 JFrame(因为这里说我没有足够的声誉来发布图像)。 JTextPane 被三张图片包围,它确实将单词换行到下一行。
所以请帮助我。如果你能用一个例子来证明你的答案,我将不胜感激。 这是图片的链接。
布局
截屏
【问题讨论】:
一个简单的解决方案可能是创建一个JLabel 并将其icon 属性设置为背景图像...
Icon icon = ...;
JLabel background = new JLabel(icon);
将标签的布局管理器设置为 GridBagLayout...
background.setLayout(new GridBagLayout());
设置GridBagConstraints insets 以便文本窗格将在包含...
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(40, 40, 40, 40);
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1;
gbc.weighty = 1;
然后只需将JTextPane 添加到标签...
JTextPane textPane = ...;
background.add(textPane, gbc);
然后您可以将JLabel 添加到您想要的任何容器中,甚至可以根据您的需要将其设置为JFrame 的内容窗格。
ps-您需要使文本窗格透明...
例如...
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.BadLocationException;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
public class TextPaneWrapped {
public static void main(String[] args) {
new TextPaneWrapped();
}
public TextPaneWrapped() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
try {
JLabel background = new JLabel(
new ImageIcon(
ImageIO.read(
new File("background.jpg"))));
background.setLayout(new GridBagLayout());
JTextPane textPane = new JTextPane();
textPane.setOpaque(false);
Style centerStyle = textPane.addStyle("center", null);
StyleConstants.setAlignment(centerStyle, StyleConstants.ALIGN_CENTER);
StyleConstants.setFontFamily(centerStyle, textPane.getFont().getFamily());
textPane.setParagraphAttributes(centerStyle, true);
Style defaultStyle = textPane.addStyle("defaultStyle", centerStyle);
StyleConstants.setFontSize(defaultStyle, 24);
Style capWord = textPane.addStyle("capWord", defaultStyle);
StyleConstants.setForeground(capWord, Color.RED);
StyleConstants.setFontSize(capWord, 48);
StyledDocument doc = textPane.getStyledDocument();
try {
doc.insertString(0, "H", capWord);
doc.insertString(1, "ello ", defaultStyle);
doc.insertString(doc.getLength(), "W", capWord);
doc.insertString(doc.getLength(), "orld", defaultStyle);
} catch (BadLocationException exp) {
exp.printStackTrace();
}
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(40, 40, 40, 40);
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1;
gbc.weighty = 1;
background.add(textPane, gbc);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(background);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException exp) {
exp.printStackTrace();
}
}
});
}
}
【讨论】:
JTextPane 不在JScrollPane 中,这将是一个问题,因为它会在您更改内容时不断更改大小...