Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JScrollPane隐藏JTextPane_Java_Swing_Jpanel_Jscrollpane_Jtextpane - Fatal编程技术网

Java JScrollPane隐藏JTextPane

Java JScrollPane隐藏JTextPane,java,swing,jpanel,jscrollpane,jtextpane,Java,Swing,Jpanel,Jscrollpane,Jtextpane,!![在此输入图像描述][1]我有以下结构 JFrame JPanel JScrollPane class that extends JTextPane 添加长文本后,JScrollPane将隐藏JTextPane 我正在使用Gridbag布局 我在扩展JTextPane的CLS中有DefaultStyledDocument 我已使用设置了JTextPane的最大大小 text.setMaximumSize(new Dimension(100,50)); 包com.

!![在此输入图像描述][1]我有以下结构

JFrame
  JPanel
    JScrollPane
      class that extends JTextPane
添加长文本后,JScrollPane将隐藏JTextPane

我正在使用Gridbag布局

我在扩展JTextPane的CLS中有DefaultStyledDocument

我已使用设置了JTextPane的最大大小

text.setMaximumSize(new Dimension(100,50)); 
包com.example

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.DefaultStyledDocument;

public class Test extends JFrame{

    IPanel p;
    public Test() {
        p = new IPanel();
        p.init();
        setTitle("Test");
        setBounds(50, 50, 200, 200);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(p);
        setVisible(true);
    }

    public static void main(String[] args) {
        Test t = new Test();
    }

}
class IPanel extends JPanel{
    public void init() {
        GridBagConstraints gbc = new GridBagConstraints();
        GridBagLayout gridbag = new GridBagLayout();
        JLabel subjectLabel = new JLabel("Text");
        gbc.weighty = 0.0;
        gbc.gridwidth = 1;
        gbc.weightx = 0.0;
        gbc.anchor = GridBagConstraints.NORTH;
        gridbag.setConstraints(subjectLabel, gbc);
        add(subjectLabel);

        TextPane Text = new TextPane(255);
        Text.setMaximumSize(new Dimension(100,20));
        Text.setPreferredSize(new Dimension(100,20));
        gridbag.setConstraints(Text, gbc);
        JScrollPane subScrollPane = new JScrollPane(Text);
        gbc.gridwidth = GridBagConstraints.REMAINDER;

        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weightx = 1.0;
        gbc.weighty = 0.0;
        gbc.insets = new Insets(0, 0, 5, 0);
        gridbag.setConstraints(subScrollPane, gbc);
        subScrollPane.setWheelScrollingEnabled(false);
        add(subScrollPane);
    }
}
class TextPane extends JTextPane{
    private Doc doc = new Doc();
    public TextPane(int lenght) {
        doc.setmaxLength(lenght);
    }
}
class Doc extends DefaultStyledDocument{
    private int maxLength = 0;
    public void setmaxLength(int lenght) {
        maxLength = lenght;
    }
}
这是一个代码示例

只需使用一个。看看这个示例,看看您可以做些什么作为替代:

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

public class ScrollPaneExample
{
    private void createAndDisplayGUI()
    {
        JFrame frame = new JFrame("JScrollPane Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(5, 5));
        JTextPane textPane = new JTextPane();
        textPane.setText("IF this is a very large text" + 
                            " still it can manage that" + 
                            " without any difficulty since" +
                            " it knows how to handle itself.");
        textPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));                    

        JScrollPane scroller = new JScrollPane();                   
        scroller.setViewportView(textPane);
        contentPane.add(scroller);

        frame.setContentPane(contentPane);
        frame.setSize(100, 200);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new ScrollPaneExample().createAndDisplayGUI();
            }
        });
    }
}

下面是一个完全相同的层次结构、相同的布局以及所有无问题的示例:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;

public class Test3 {

    protected static void initUI() {
        JFrame frame = new JFrame("Test text pane");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTextPane text = new JTextPane();
        text.setText(LONG_TEXT);
        JScrollPane scrollPane = new JScrollPane(text);
        JPanel panel = new JPanel(new GridBagLayout());
        panel.add(scrollPane, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(
                0, 0, 0, 0), 0, 0));
        frame.add(panel);
        frame.setSize(600, 400);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                initUI();
            }
        });
    }

    private static final String LONG_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In molestie purus vel ipsum commodo id bibendum est porta. Proin leo nisl, facilisis eu euismod eget, fermentum a lacus. Nulla pulvinar ante at elit tristique condimentum. Suspendisse ac erat eu lectus vulputate sagittis sed a urna. In diam ligula, blandit id scelerisque sit amet, porttitor in libero. Curabitur in rhoncus tellus. Aenean dignissim dui semper ante pharetra interdum scelerisque vel tortor. Vestibulum id arcu mauris. Integer ut magna purus. Mauris orci massa, porta sollicitudin rutrum eu, ultrices non leo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla sem justo, dapibus in euismod et, gravida sit amet eros.\r\n"
            + "\r\n"
            + "Suspendisse id ligula sit amet neque euismod commodo in at massa. Sed pretium lobortis vulputate. Aliquam non eros odio, non accumsan nisi. Phasellus vel nisl tellus, quis tincidunt risus. Donec ut nulla felis. Morbi sit amet enim arcu. Integer iaculis mi id sem vulputate non lacinia dui dictum.\r\n"
            + "\r\n"
            + "Praesent luctus neque in purus convallis vel aliquet dui rutrum. In lobortis nisl eu nisi tincidunt adipiscing sodales sapien sodales. Morbi augue massa, dictum vel hendrerit vel, tincidunt id lectus. Proin vulputate nunc placerat ante fringilla vitae ullamcorper mauris fringilla. Duis et massa sapien. Integer porta elementum enim in lobortis. Morbi eget mi nunc. Quisque nec arcu eget orci elementum consectetur ut in metus.\r\n"
            + "\r\n"
            + "Donec iaculis felis vel felis rutrum id congue tellus aliquet. Ut vel sapien mauris, quis sodales odio. Aliquam cursus urna a leo lacinia eget porttitor ante mattis. Aenean dictum, tellus in volutpat luctus, magna eros feugiat tortor, nec lobortis diam justo vel est. Praesent sit amet nisl sed eros semper ultrices. Nunc lobortis scelerisque sapien, ac sodales nibh viverra ac. Etiam auctor, odio ut venenatis hendrerit, odio ipsum sollicitudin libero, non adipiscing nisi eros at nulla. Nulla consequat arcu in libero pellentesque sit amet aliquet arcu elementum. Nulla facilisi. Proin sodales neque quis turpis gravida ac mollis ipsum ultricies. Mauris lorem magna, ultricies a dignissim sit amet, egestas et neque. Phasellus iaculis pellentesque ultrices. Phasellus a consectetur nisl. Proin ac quam id lectus dignissim lacinia. Praesent ligula purus, mattis eu pellentesque nec, convallis id lorem.\r\n"
            + "\r\n"
            + "Cras at sapien vitae felis fermentum consectetur sed eu justo. Mauris in felis mi. Vestibulum felis neque, varius at aliquet non, ornare at eros. In hac habitasse platea dictumst. Vivamus placerat, tellus laoreet pulvinar tempor, velit elit aliquet diam, eu ullamcorper purus enim non lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Etiam et enim magna. Ut varius, lectus at luctus laoreet, urna mauris euismod velit, vitae sodales nulla nulla non sem. Phasellus eget viverra erat. Phasellus quam ante, vehicula sed tristique vestibulum, ullamcorper et nunc. Phasellus placerat congue tellus, condimentum volutpat ligula convallis fringilla. Curabitur quis nibh lorem, ut feugiat velit. Aliquam vehicula pellentesque aliquet. ";
}
编辑:

这两行代码有问题:

Text.setMaximumSize(new Dimension(100, 20));
Text.setPreferredSize(new Dimension(100, 20));
您正在强制设置JTextPane的首选和最大大小。您提供了非常严格的约束。通常,滚动条的宽度/高度约为20px,这意味着当水平滚动条出现时,它将占据组件的大部分高度

还要注意代码中的以下错误:

  • init()
    方法中声明GridBagLayout,但没有在面板上设置它(使用
    setLayout
    ),这意味着实际执行布局的是
    FlowLayout
  • 您正在文本窗格上设置GBC,但您没有将文本窗格添加到面板,而是添加了滚动窗格,因此设置这些约束不会对布局产生任何影响
  • 我不知道你想达到什么目的。在我看来,一个简单的
    JTextField
    就足够了,但我没有足够的上下文来了解

    编辑2:

  • 将IPanel上的布局设置为在init()方法中创建的
    gridbag
  • 为滚动窗格约束添加以下约束提示:

    gbc.fill = GridBagConstraints.BOTH;
    gbc.weighty = 1.0;
    

  • 并非所有LayoutManager都将强制执行最大大小。你的层次看起来很简单,所以考虑发布一个给我们看你的问题,也表明你在期待什么。很难判断问题是什么以及您希望如何解决问题。如果您尝试将一个添加到
    JTextPane
    ,这样就不会有内容出现在
    JScrollPane
    ,只需编写类似
    textPane.setBorderFactory.createEmptyBorder(20,20,20,20))的内容
    ,尝试一些值,其中一个值将适合您的需要我已编辑了该问题,因为代码在许多文件中传播。不可能添加实际代码。@shraddha我不是要求发布您的全部代码,而是提供一个可以提取您问题本质的示例。这将使我们能够帮助您并找出问题所在。您可以在3分钟内设置此层次结构,然后尝试在其上重现您的问题。是否有理由设置此空边框?@GuillaumePolet:Ejactly,以便
    JScrollPane
    不会出现在
    JTextPane
    中的文本顶部,这将在文本和
    JScrollPane
    之间留出一些间隙。以您的示例为例,删除空边框似乎不会导致问题,即使您将框架调整为非常小的大小(滚动条不会位于文本顶部)。ScrollPaneLayout会考虑滚动条。请看一下这个和这个,看看我在说什么。我记得第一个链接仍然让我困惑:-)。这是一种非常不寻常的操作方式(通常将textareas直接放在滚动窗格中),问题可能是因为ViewPortView没有实现可滚动(我尝试创建了一个JPanel,它实现可滚动并跟踪视口的宽度和高度,从而解决了问题)。但是在这个问题中,文本窗格直接位于滚动窗格的下方,因此这似乎不会引起问题。我猜我上面解释的+1场景出现在
    JTextArea/JTextField
    ,因为默认情况下只有
    垂直JSCROLLPANE
    用于
    JTextPane
    对不起,但我有问题,水平滚动条不是垂直的。此示例不再现此问题。@shraddha我编辑了我的文章,并提供了有关您发布的代码的更多信息。状态文本窗格需要defaultstyleddocument。这就是我添加它的原因&我还想添加长度限制。我只是希望文本框即使在水平滚动条出现后也能可读。。我需要坚持这个结构。@shraddha我又添加了一个编辑,应该可以解决您的问题。默认情况下,JTextPane将为您创建适当的文档。您所要做的就是将DocumentListener添加到JTextPane的文档中,并防止输入过多的文本。