【问题标题】:Surrounding JTextPane with images用图像包围 JTextPane
【发布时间】:2014-03-04 22:23:34
【问题描述】:

我正在自己开发一个项目,并希望创建一个看起来像链接中提供的屏幕截图的 JComponent 或 JFrame(因为这里说我没有足够的声誉来发布图像)。 JTextPane 被三张图片包围,它确实将单词换行到下一行。

所以请帮助我。如果你能用一个例子来证明你的答案,我将不胜感激。 这是图片的链接。

布局

截屏

【问题讨论】:

    标签: java swing layout


    【解决方案1】:

    一个简单的解决方案可能是创建一个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();
                    }
                }
            });
        }
    
    }
    

    【讨论】:

    • 我希望使用无法正确显示图片的 GridBagLayout 放置。
    • @user3380414 您可能遇到的问题是让图像相互对齐。如果JTextPane 不在JScrollPane 中,这将是一个问题,因为它会在您更改内容时不断更改大小...
    • @user3380414 您还必须记住,不同平台/渲染管道之间的字体大小(以像素为单位)会有所不同,因此很难依靠布局管理器来准确地排列单独的图像。请记住,您永远不应该尝试实现像素完美的布局,它只会一直在后面......
    • 您的回答非常精彩,我喜欢您为文本窗格设置样式的方式。但还有一件事,我希望 JTextPane 在空间不适合时水平继续,而不是将单词换行到下一行。在这个例子中我如何实现这一点?谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多