3

と で を作りたかったJOptionPane.showOptionDialogJTextAreaですJLabel。問題は、ダイアログが小さすぎて解決策が見つからなかったため、コンテンツをJScrollPane.

JTextAreamyと myをすべてJLabelaに入れなければならないことがわかりました。JPanelなぜなら、それらを続けて追加するとJScrollPaneビューポートを正しく配置できないからです。

最後の問題は、私の JTextArea が単語を正しくラップしていることですが、2 文字または 3 文字の長さの単語があると、スクロールバーに隠れてしまいます。

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]); 

        }
    }

私はいくつかのテーマを読みましたが、それらは常に setWrapStyleWord について話しています。水平スクロールバーが必要ないため、無効にします。実際、2文字のオフサイドのスクロールバーは必要ありません。

私の意見では、問題はスクロールバーを a で構築することJPanelですが、他の解決策が見つかりません。

私の投稿または私の英語に関するフィードバックも大歓迎です。

4

2 に答える 2

4

JScrollPaneJPanel親にを追加しています。そうすれば、テキストをレンダリングするよりも幅が広いと見なされます。JLabelJTextAreaJTextArea

代わりにスクローラーを追加することをお勧めしますJTextArea(スクロールペインを親にします)。次に、textareaは実際の幅を認識します(スクロールバーを除く)。


例:

スクリーンショット

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);
}
于 2012-06-13T14:48:06.810 に答える
4

私のコメントに答えてください。追加する にEmpty Borderを1 つ提供するようにしてください。または、EmptyBorder に 1 つの EmptyBorder を追加することもできます。JPanelJScrollPaneJTextArea

于 2012-06-13T14:40:48.903 に答える