複数行ヘッダーのJTableヘッダーテキストの折り返し(カスタムTableCellRenderer)

sarah.ferguson

ヘッダー列がテキストに合わせて正しく拡大され、新しい行に折り返される複数行のJTableヘッダーを取得するにはどうすればよいですか?

以下に示すようなもの:

列ヘッダーの折り返し

現在、上記の要件を検索すると、多くの解決策が返されますが、実際に問題を解決するものはありません。

http://www.javarichclient.com/multiline-column-header/

JTableの複数行ヘッダーの作成

JavaJTableヘッダーワードラップ

上記のソリューションはすべて、たとえばHTMLコードの使用を提案しています。

String[] columnNames = {
    "<html><center>Closing<br>Date</html>",
    "<html><center>Open<br>Price</html>",
    "<html>Third<br>column</html>"
};

このソリューションは、いくつかの理由でエレガントではありません。主な理由は、可変列名の場合、スペースを削除して<br>記号で置き換える関数に文字列を渡す必要があるためです。ただし、列テキストに次のような非常に短いテキストが含まれている場合は、独自のライン。

列の最小長と最大長を決定してから、テキストの中央揃えを可能にする必要があります。上記のソリューションはすぐに過剰に設計され、管理できなくなります。

http://www.java2s.com/Code/Java/Swing-Components/MultiLineHeaderTable.htm

http://www.java2s.com/Code/Java/Swing-Components/MultiLineHeaderExample.htm

multilineheader2

上記のソリューションでは、次のように単語がすでに正しく分割されているヘッダー配列を手動で作成する必要があります。

  public static Object[][] tableHeaders = new Object[][] {
      new String[] { "Currency" },
      new String[] { "Yesterday's", "Rate" },
      new String[] { "Today's", "Rate" },
      new String[] { "Rate", "Change" } };

-または-

DefaultTableModel dm = new DefaultTableModel();
    dm.setDataVector(
        new Object[][] { { "a", "b", "c" }, { "A", "B", "C" } },
        new Object[] { "1st\nalpha", "2nd\nbeta", "3rd\ngamma" });

列名の可変テキストは実行可能ではないため、まだエレガントではありません。

JTableヘッダーの高さを変更するにはどうすればよいですか?

上記の解決策のようにヘッダーの高さを手動で設定することは、テキストが正しく折り返されず、高さを決定することがまだ実行できないため、私がやりたいことの半分にすぎません。

現在、私ができたのはカスタムTableCellRendererを作成することだけでしたが、解決策はありませんでした。

import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

import java.util.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import javax.swing.*;
import javax.swing.table.*;

/**
 * @version 1.0 11/09/98
 */
public class MultiLineHeaderExample extends JFrame
{

    MultiLineHeaderExample()
    {
        super("Multi-Line Header Example");

        DefaultTableModel dm = new DefaultTableModel();
        dm.setDataVector(new Object[][]
        {
            {
                "a", "b", "c"
            },
            {
                "A", "B", "C"
            }
        },
        new Object[]
                {
                    "My First Column, Very Long But Space Separated", "short col", "VeryLongNoSpaceSoShouldSomeHowWrap"
        });

        JTable table = new JTable(dm);
        MultiLineHeaderRenderer renderer = new MultiLineHeaderRenderer();
        Enumeration enumK = table.getColumnModel().getColumns();
        while (enumK.hasMoreElements())
        {
            ((TableColumn) enumK.nextElement()).setHeaderRenderer(renderer);
        }
        JScrollPane scroll = new JScrollPane(table);
        getContentPane().add(scroll);
        setSize(400, 110);
        setVisible(true);
    }

    public static void main(String[] args)
    {
        MultiLineHeaderExample frame = new MultiLineHeaderExample();
        frame.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
    }
}

class MultiLineHeaderRenderer extends JList implements TableCellRenderer
{

    public MultiLineHeaderRenderer()
    {
        ListCellRenderer renderer = getCellRenderer();
        ((JLabel) renderer).setHorizontalAlignment(JLabel.CENTER);
        setCellRenderer(renderer);
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column)
    {
        setFont(table.getFont());
        String str = (value == null) ? "" : value.toString();
        BufferedReader br = new BufferedReader(new StringReader(str));
        String line;
        Vector v = new Vector();
        try
        {
            while ((line = br.readLine()) != null)
            {
                v.addElement(line);
            }
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
        setListData(v);
        return this;
    }
}
ステファン

これJTextAreaは、テーブルのサイズが変更されたときにヘッダーの高さも使用し、サイズを変更します。テーブルヘッダーの高さを正しく計算するための鍵は次のとおりです。setSize(width, getPreferredSize().height);

class MultiLineTableHeaderRenderer extends JTextArea implements TableCellRenderer
{
  public MultiLineTableHeaderRenderer() {
    setEditable(false);
    setLineWrap(true);
    setOpaque(false);
    setFocusable(false);
    setWrapStyleWord(true);
    LookAndFeel.installBorder(this, "TableHeader.cellBorder");
  }

  @Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    int width = table.getColumnModel().getColumn(column).getWidth();
    setText((String)value);
    setSize(width, getPreferredSize().height);
    return this;
  }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

折り返され、中央揃えのテキストを含むJTable列ヘッダー

特定の行のヘッダーを使用して、テキストファイルを複数のパンダデータフレームに分割します

UWPのToggleSwitchのヘッダーフィールドでテキストを折り返す方法

UITablesセクションヘッダーの複数行テキスト

ヘッダーテキストが折り返されている

css / bootstrapのみを使用したスティッキーな複数のテーブルヘッダー(thead)行

ヘッダーとヘッダーテキストを使用してパネルを折りたたむ

JTableヘッダーの各列のツールチップテキスト

PrimeNGはカスタムヘッダーテキストを追加します

ヘッダーテキストを更新した後、NavigationViewヘッダーの値が重複しています

カスタムRecyclerViewの作成:ヘッダーとアイテムリスト

HttpClientリクエストへのカスタムヘッダー

JTableの列ヘッダーをカスタマイズする

ヘッダーの後に複数行のテキストをキャプチャする

実行時のDataGridViewヘッダーテキストの変更

列ヘッダーのみをテキストとして返します

ui-grid、angularのカスタムヘッダーテンプレート

ミニテストテストは、Rails4.2のカスタムHTTPヘッダーで失敗します

ReactNativeのカスタムヘッダーレイアウト

RSpecを介したカスタムヘッダーの送信

JTableの列ヘッダーテキストを動的に変更する

カスタムヘッダー付きのリクエストはAttributeErrorを返します

JTable複数ヘッダー行

FlaskとWerkzeug:カスタムヘッダーを使用した投稿リクエストのテスト

SparkのRDDで複数行のヘッダーをスキップする方法

WPFDataGridヘッダーテキストの背景の塗りつぶし

theadに複数の行があるスティッキーヘッダーテーブル

カスタムヘッダー付きのユニットテストインターセプター

HttpRequestMessage複数のカスタムヘッダーが相互に上書きします

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    Ansibleで複数行のシェルスクリプトを実行する方法

  3. 3

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  4. 4

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  5. 5

    Crashlytics:コンパイラー生成とはどういう意味ですか?

  6. 6

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  7. 7

    パンダは異なる名前の列に追加します

  8. 8

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  9. 9

    グラフ(.PNG)ファイルをエクスポートするZabbix

  10. 10

    Chromeウェブアプリのウェブビューの高さの問題

  11. 11

    ラベルとエントリがpythontkinterに表示されないのはなぜですか?

  12. 12

    Windows 10の起動時間:以前は20秒でしたが、現在は6〜8倍になっています

  13. 13

    mutate_allとifelseを組み合わせるにはどうすればよいですか

  14. 14

    Reactでclsxを使用する方法

  15. 15

    ネットワークグラフで、ネットワークコンポーネントにカーソルを合わせたときに、それらを強調表示するにはどうすればよいですか?

  16. 16

    テキストフィールドの値に基づいて UIslider を移動します

  17. 17

    ファイル内の2つのマーカー間のテキストを、別のファイルのテキストのセクションに置き換えるにはどうすればよいですか?

  18. 18

    MLでのデータ前処理の背後にある直感

  19. 19

    Unity:未知のスクリプトをGameObject(カスタムエディター)に動的にアタッチする方法

  20. 20

    Pythonを使用して同じ列の同じ値の間の時差を取得する方法

  21. 21

    グラフからテーブルに条件付き書式を適用するにはどうすればよいですか?

ホットタグ

アーカイブ