如何在JScrollPane中修复JEditorPane的高度?

时间:2015-08-19 18:12:26

标签: java swing jpanel jscrollpane layout-manager

我想将JScrollPane中JEditorPane的高度限制为具有最大值,但仍允许扩展宽度以适合内容。

我的理由是,我想要一行文本,允许我嵌入组件。我真的想要一个像嵌入式组件的JTextField,但由于JTextField无法做到这一点,我使用的是JEditorPane(JTextPane也可以。)

我正在尝试模仿桌面Swing应用程序中的StackOverflow标记行为。所以我会在JEditorPane中嵌入可点击的“标签”,它们都会出现在一行中,就像SO一样。

按照目前的情况,JEditorPane垂直扩展,但不能横向扩展这个SSCCE:

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

public class Tags {
    /*
     * This is the method I want to modify to implement this behavior:
     */
    public static JComponent buildTagsComponent() {
        JScrollPane scrollPane = new JScrollPane();
        JEditorPane editorPane = new JEditorPane();
        scrollPane.setViewportView(editorPane);
        return scrollPane;
    }
    /*
     * The remainder of this code is just to make the example complete.
     */
    public static JFrame buildFrame() {
        JFrame frame = new JFrame("Tags example");
        JPanel panel = new JPanel();
        JPanel tagsPanel = new JPanel();
        JLabel tagsLabel = new JLabel("Tags:");
        JLabel mainContent = new JLabel("Main Content Goes Here");
        tagsPanel.add(tagsLabel);
        tagsPanel.add(buildTagsComponent());
        panel.setLayout(new BorderLayout());
        panel.add(tagsPanel,BorderLayout.SOUTH);
        panel.add(mainContent,BorderLayout.CENTER);
        frame.setContentPane(panel);
        return frame;
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(
            new Runnable() {
                public void run() {
                    JFrame frame = buildFrame();
                    frame.pack();
                    frame.setVisible(true);
                }
            }
        );
    }
}

另请注意,我计划禁用滚动条,并需要使用手势滚动或使用光标键移动光标位置。当我为滚动条策略添加“永不”时,这使得事情根本不可滚动。我现在不是在寻找滚动问题的解决方案,我只想让答案考虑到我将滚动条策略设置为从不为水平和垂直。

我已尝试将高度和宽度(最小值,首选值和最大值)分别设置为12和Integer.MAX_VALUE

更新

经过一番研究后,我相信我正在寻找的解决方案与自动换行有关。我希望JEditorPane在没有换行符时换行(换行)。

2 个答案:

答案 0 :(得分:2)

目前,由于布局管理器,编辑器窗格不会水平调整大小。 JPanel的默认值为FlowLayout,它会按固定的首选大小调整组件大小。

尝试BoxLayout

JPanel tagsPanel = new JPanel();
tagsPanel.setLayout(new BoxLayout(tagsPanel, BoxLayout.LINE_AXIS));
// then add components

额外提示:为了改善面板的外观,您可以添加不可见的组件(在其他组件之间放置空间)和/或空边框(与其他组件创建边距:

tagsPanel.add(tagsLabel);
tagsPanel.add(Box.createRigidArea(new Dimension(10,0)));
tagsPanel.add(buildTagsComponent());
tagsPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));

<小时/> 关于换行问题(您无法在JEditorPane中轻松停用,与JTextArea不同),建议使用here(从this post引用)。< p>

基本上您必须延长StyledEditorKit并将其设置为JEditorPane

<小时/> 关于JScrollPane的行为,可能解决方案是使用AS_NEEDED默认设置,但customize the UI of the scroll bars使其大小等于零。这样您就可以在没有滚动条本身的情况下进行滚动操作。

答案 1 :(得分:0)

在JScrollPane初始化中尝试此操作:

In [2]: from django.apps import apps
In [3]: Poll = apps.get_model('my_app', 'Poll')
In [4]: Poll.MY_VAR
Out[4]:  ['my_class_level_attribute']