问题
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