0

JScrollPane内にJlistがあり、大きなリストの幅を計算する必要がないようにプロトタイプ値を設定しましたが、このデフォルトの幅を使用するだけです。

ここで問題となるのは、Jlistが何らかの理由で要素の末尾をドット(...)に置き換えているため、水平スクロールバーが表示されないことです。

「ラッピング」で無効にするにはどうすればよいですか?長い要素がJlistの幅よりも広い場合、ドットに置き換えられないようにするには?

小さなサンプルアプリケーションで問題を再現しました。私の意味がわからない場合は、実行してください。

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

public class Test
{
    //window
    private static final int windowWidth = 450;
    private static final int windowHeight = 500;

    //components
    private JFrame frame;
    private JList classesList;
    private DefaultListModel classesListModel;

    public Test()
    {
        load();
    }

    private void load()
    {   
        //create window
        frame = new JFrame("Test");
        frame.setSize(windowWidth, windowHeight);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(true);
        frame.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);

        //classes list
        classesListModel = new DefaultListModel();
        classesList = new JList(classesListModel);
        classesList.setPrototypeCellValue("prototype value");
        classesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        classesList.setVisibleRowCount(20);
        JScrollPane scrollClasses = new JScrollPane(classesList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);     

        for (int i = 0; i < 200; i++)
        {
            classesListModel.addElement("this is a long string, does not fit in width");
        }

        //panel
        JPanel drawingArea = new JPanel();
        drawingArea.setBackground(Color.white);

        drawingArea.add(scrollClasses);
        frame.add(drawingArea);

        //set visible
        frame.setVisible(true);
    }
}

水平スクロールバーを強制しても、ドット(...)が折り返されているため、要素は実際には幅よりも広くないため、スクロールすることはできません。

前もって感謝します。

4

3 に答える 3

3

スクロールペインに追加されたコンポーネントの適切なサイズがスクロールペインのサイズより大きい場合、スクロールバーが自動的に表示されます。

setPrototypeCellValue(...) メソッドを使用すると、リストが優先サイズを計算する方法に影響を与えます。つまり、文字列が切り捨てられないように適切な値を提供する必要があります。

したがって、簡単な解決策はその方法を使用しないことですが、さらに、スクロールペインの優先サイズを好きなように設定する必要があります。必要に応じて水平スクロールバーが表示されます。

于 2010-04-27T20:24:58.980 に答える
2

その質問に対する私の答えは、最初にリスト内で最も長い要素を見つけてから、その要素に対してsetPrototypeメソッドを使用することです。

于 2010-10-21T10:26:50.263 に答える
1

呼び出すと、最大幅を文字列「プロトタイプ値」の長さに制限するようclassesList.setPrototypeCellValue("prototype value")に指示されます。JList classesList( javadoc を参照)

その後、リストに「これは長い文字列です。幅に収まりません」という文字列を入力すると、幅に収まらないのも不思議ではありません。あなたが与えたプロトタイプの幅は、リストを埋める文字列の幅よりも小さいためです。

JScrollPane はスクロールバーを自動的に表示するため、通常はその動作を調整する必要はありません。また、JList は自動的に幅を調整して、リスト内の最大幅の項目を表示しようとします。を呼び出して幅を修正するように JList に指示すると、問題が発生しますsetPrototypeCellValue()

コメントアウトすると

classesList.setPrototypeCellValue("prototype value");

またはそれを

classesList.setPrototypeCellValue("this is a long string, does not fit in width");

その後、期待どおりに機能します。

于 2010-04-27T20:36:22.483 に答える