JScrollPane中的JEditorPane没有根据需要调整大小

时间:2008-11-11 05:35:20

标签: java swing jscrollpane resize jeditorpane

我正在我的应用程序中实现一个注释框工具,用户可以使用鼠标调整大小。此注释框包含一个滚动窗格,其中包含一个JEditorPane,用户可以在其中插入注释。我在滚动窗格中添加了编辑器窗格,原因如下:

auto scolling of jeditorpane

当用户调整评论框大小时,我会为JScrollPaneJEditorPane设置所需的大小。当用户增加评论框的大小时,这些组件的大小会根据需要增加,但是当评论框的大小减小时,JEditorPane的大小即使在设置大小后也不会减少。这导致滚动窗格内的滚动条。

我尝试将setPreferrredSizesetSizesetMaximumSize用于JEditorPane。编辑器窗格的大小仍然没有减少。我在设置尺寸后尝试调用revalidate()updateUI()但没有用。

我正在使用Java 1.4.2。

请给我一些见解......

3 个答案:

答案 0 :(得分:9)

我意识到这已经很久了,但是为了将来的参考,您需要做的是覆盖getScrollableTracksViewportWidth()以始终返回true,例如。

JEditorPane pane = new JEditorPane() {
    public boolean getScrollableTracksViewportWidth() {
        return true;
    }
};
panel.add(new JScrollPane(pane));

答案 1 :(得分:4)

实际上有可能,luiscubal。这是怎么回事,

向JScrollPane添加用于调整大小事件的ComponentListener

public static void main(String...args) {
    //our test frame
    JFrame frame = new JFrame("JEditorPane inside JScrollPane resizing");
    frame.setLayout(new BorderLayout());

    //our editing pane
    final JEditorPane editor = new JEditorPane();

    //our simple scroll pane
    final JScrollPane scroller = new JScrollPane(editor);

    //NOTE: this is the magic that is kind of a workaround
            // you can also implement your own type of JScrollPane
            // using the JScrollBar and a JViewport which is the 
            // preferred method of doing something like this the 
            // other option is to create a JEditorPane subclass that
            // implements the Scrollable interface.
    scroller.addComponentListener(new ComponentAdapter() {
        @Override
        public void componentResized(ComponentEvent e) {
            editor.setSize(new Dimension(
                               scroller.getWidth()-20, 
                               scroller.getHeight()-20));
        }
    });

    //just use up the entire frame area.
    frame.add(scroller, BorderLayout.CENTER);

    //quick and dirty close event handler
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(320, 240); //something not too big
    frame.setLocationRelativeTo(null); //centers window on screen
    frame.setVisible(true); // normally done in a SwingUtilities.invokeLater
}

看看luiscubal它是可能的。不要那么快就用Java宣布事情是不可能的。 swing api安静灵活,可以为您完成大量工作。但是,如果你以不同的方式使用JComponents,那么你最终会遇到问题并有两个选择。

  1. 子类子类子类基本上创建自己的组件。
  2. 找到一个解决方法,就像上面的解决方案一样。

答案 2 :(得分:-1)

不可能在JScrollPane中减小JEditorPane的大小然后减少它。 您可能想要使用JTextArea。