質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
JTable

JTableとは二次元的なセルの表を表示し編集するJava Swing用のコンポーネントです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

解決済

ソースコード上の値ではなくて自分で編集した値を使って空白セルを用いたJTableのグループ化を実現したいんですが

rokkunroru
rokkunroru

総合スコア10

JTable

JTableとは二次元的なセルの表を表示し編集するJava Swing用のコンポーネントです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

2回答

1評価

1クリップ

483閲覧

投稿2022/04/08 14:19

編集2022/04/17 19:09

前提

https://ateraimemo.com/Swing/RowGroupInTable.html
このサイトの参考リンクのstackoverflowにある回答欄のソースコードについて

やりたいこと

コピペして何回か実行してみました。すると問題点が出てきました
すでに登録?保存?した値(例addMyData(model, new MyData("Tom", 17, "Book1"));
についてはレンダラーの機能で表現できていると思うのですが
新しいデータを追加してソートしたい場合には
新しい行を追加して空のセルの中に編集した値を入れるという風に考えると思います
しかしうまい方法が思い浮かびません

自分の頭の中

まず新しい行を追加するにはaddRowメソッドで追加するしかないので
model.addRow();
でも空の行を追加したいので
model.addRow(new Object[]);
と書くけどその行に新規のデータを手打ちしてソートしようにもモデルと紐づけられてないのでこれは無理
じゃあ、MyDataクラスのようにコンストラクタとゲッターを作ってそれを利用するか?いや待てよ
自分が編集したらこのコンストラクタは生成されないから意味ないだろ?

諦めきれない

一か月ほど前、似たような質問でベストアンサーの方に
「> 空っぽの行を追加して値を入力して保存する

コード的には逆のほうが分かり易いと思います。
つまり、追加ボタンを押したら ( 例えば ) 入力用のダイアログを出して日付や氏名等を入力し、 OK が押されたらそのデータで TableModel に addRow するということです。」
という回答をしてもらったんですが
その回答は確かにコードを作る側として簡単そうなんですけど
いざプログラムが完成したときに使う側としては一々ダイアログを出して入力する作業がめんどくさそうなんですよ
今ここで躓いています何か打開する方法を教えてください

追記
つまり何が言いたいのかというと
手打ちした値を何かに保存してそれをモデルと関連付けてソートしてさらにグループ化を表現したい(ダイアログの方法以外で
ということです

該当のソースコード

java

import java.awt.*; import java.util.*; import java.util.List; import javax.swing.*; import javax.swing.table.*; public class RowGroupInTableTest { private JComponent makeUI() { String[] titles = new String[] {"Name", "Last job duration", "Book #"}; DefaultTableModel model = new DefaultTableModel(null, titles) { @Override public Class<?> getColumnClass(int column) { return MyData.class; } }; addMyData(model, new MyData("Tom", 17, "Book1")); addMyData(model, new MyData("Tom", 23, "Book2")); addMyData(model, new MyData("Tom", 25, "Book3")); addMyData(model, new MyData("Polazzo", 41, "Book1")); addMyData(model, new MyData("Polazzo", 45, "Book2")); addMyData(model, new MyData("Polazzo", 12, "Book3")); addMyData(model, new MyData("Anna", 1, "Book3")); addMyData(model, new MyData("Anna", 33, "Book5")); JTable table = new JTable(model); table.setFillsViewportHeight(true); table.setDefaultRenderer(MyData.class, new MyRenderer()); TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel()); Comparator<MyData> c = Comparator.comparing(MyData::getName); sorter.setComparator(0, c); sorter.setComparator(1, c.thenComparing(Comparator.comparingInt(MyData::getDuration))); sorter.setComparator(2, c.thenComparing(Comparator.comparing(MyData::getBook))); table.setRowSorter(sorter); return new JScrollPane(table); } private static void addMyData(DefaultTableModel model, MyData data) { //Omission work... model.addRow(Collections.nCopies(3, data).toArray()); } public static void main(String[] args) { EventQueue.invokeLater(() -> { JFrame f = new JFrame(); f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); f.getContentPane().add(new RowGroupInTableTest().makeUI()); f.setSize(320, 240); f.setLocationRelativeTo(null); f.setVisible(true); }); } } class MyData { private final String name; private final int duration; private final String book; protected MyData(String name, int duration, String book) { this.name = name; this.duration = duration; this.book = book; } public String getName() { return name; } public int getDuration() { return duration; } public String getBook() { return book; } } class MyRenderer implements TableCellRenderer { TableCellRenderer def = new DefaultTableCellRenderer(); @Override public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { JLabel orig = (JLabel) def.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column); orig.setHorizontalAlignment(SwingConstants.LEFT); MyData data = (MyData) value; switch (table.convertColumnIndexToModel(column)) { case 0: String str = data.getName(); if (row > 0) { //if (table.getModel().getValueAt(row-1, column).equals(value)) { //Since it compares with the value of the previous line on the display, //table.getModel() is not needed MyData prev = (MyData) table.getValueAt(row - 1, column); if (Objects.equals(prev.getName(), str)) { str = " "; } } orig.setText(str); break; case 1: orig.setHorizontalAlignment(SwingConstants.RIGHT); orig.setText("" + data.getDuration()); break; case 2: orig.setText(data.getBook()); break; default: break; } return orig; } }

補足情報(FW/ツールのバージョンなど)

All in One パッケージ Eclipse 2021

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

TN8001

2022/04/17 10:09

回答で解決したなら「解決済」にしてください。 [ヘルプ | 質問を解決済みにしたい](https://teratail.com/help#resolve-question) 解決していないのであれば、問題点・わからない点等をコメントするか質問を編集してください。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

JTable

JTableとは二次元的なセルの表を表示し編集するJava Swing用のコンポーネントです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。