JTextArea in JScrollPane wrapping words but missing letters

≯℡__Kan透↙ 提交于 2019-12-12 13:31:44

问题


I wanted to make a JOptionPane.showOptionDialog with some JTextArea and JLabel. The problem was that the dialog was too small and i didn't find any solutions, so i just decided to put my content in a JScrollPane.

I saw that i must put all my JTextArea and my JLabel in a JPanel because adding them in the JScrollPane in a row doesn't allow me to put the viewport correctly.

The final problem is that my JTextArea are wrapping words correctly but when i have words of 2 or 3 letters lenght, they are hide by the scrollbar.

SSCCE :

public class myTest extends JFrame
{
        public static void main(String[] args)
        {
            new myTest();
        }
        public myTest()
        {
            String myLongString="Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?";
            String aLittleString="I am a poor little string which is placed at the bottom of a JOptionPane.";
            String[] options = {"OK","NO"}; 

            JLabel titre1 = new JLabel("Title"); 
            JLabel titre2 = new JLabel("Title 2");

            Map<TextAttribute,Integer> attributs = new HashMap<TextAttribute, Integer>();
            attributs.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
            Font police = new Font("Serif", Font.BOLD, 12).deriveFont(attributs); 

            titre1.setFont(police);
            titre2.setFont(police);

            JTextArea text3 = new JTextArea(myLongString,5,75); 
            text3.setLineWrap(true);
            text3.setWrapStyleWord(true);
            text3.setEditable(false);
            Color back = this.getBackground();
            text3.setBackground(back);
            JTextArea text = new JTextArea(myLongString,5,75); 
            text.setLineWrap(true);
            text.setWrapStyleWord(true);
            text.setEditable(false);
            text.setBackground(back);

            JTextArea text2 = new JTextArea(aLittleString,5,75); 
            text2.setLineWrap(true);
            text2.setWrapStyleWord(true);
            text2.setEditable(false);
            text2.setBackground(back);
            JPanel bas = new JPanel(new BorderLayout());
            JPanel basbas = new JPanel(new BorderLayout());

            bas.add(titre1,BorderLayout.NORTH);
            bas.add(text,BorderLayout.CENTER);
            basbas.add(titre2,BorderLayout.NORTH);
            basbas.add(text2,BorderLayout.CENTER);
            basbas.add(text3,BorderLayout.SOUTH);
            bas.add(basbas,BorderLayout.SOUTH);

            JScrollPane js = new JScrollPane(bas);
            js.setBorder(null);
            js.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            js.setViewportView(bas);
            JLabel lMessage = new JLabel("A message."); 

            Object[] params = {js,lMessage}; 

            int n = JOptionPane.showOptionDialog(new JFrame(),
                    params,
                    "my dialog", 
                    JOptionPane.YES_NO_OPTION,
                    JOptionPane.QUESTION_MESSAGE,
                    null, 
                    options, 
                    options[0]); 

        }
    }

I read several subjects, but they are always speaking about setWrapStyleWord. I disable the horizontal scrollbar because i don't want it, in fact i don't want a scrollbar for 2 letters off-side.

In my opinion the problem is that i construct the scrollbar with a JPanel but i don't find an other solution.

Any feedback on my post or my english are as well welcome.


回答1:


Putting my comment to answer. Please do try to provide one Empty Border to your JPanel to which you are adding JScrollPane, or you can add one EmptyBorder to your JTextArea.




回答2:


You are adding the JScrollPane to the JPanel parent of a JLabel and a JTextArea. That way the JTextArea will think that it as a wider width than it has to render the text on.

I would suggest you to add the scroller to the JTextArea instead (making the scrollpane the parent). Then the textarea will know the real width (excluding scrollbars).


Example:

public static void main(String[] args) {

    String myLongString="Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?";
    String[] options = {"OK","NO"}; 

    JTextArea text = new JTextArea(myLongString, 5, 55); 
    text.setLineWrap(true);
    text.setWrapStyleWord(true);
    text.setEditable(false);

    JPanel bas = new JPanel(new BorderLayout());
    bas.add(new JLabel("Title"), BorderLayout.NORTH);
    bas.add(new JScrollPane(text),BorderLayout.CENTER);

    JOptionPane.showOptionDialog(new JFrame(),
            bas,
            "my dialog", 
            JOptionPane.YES_NO_OPTION,
            JOptionPane.QUESTION_MESSAGE,
            null, 
            options, 
            options[0]); 

    System.exit(0);
}


来源:https://stackoverflow.com/questions/11016041/jtextarea-in-jscrollpane-wrapping-words-but-missing-letters

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!