クエリの後に結果がない場合、JTable 内に中央揃えのテキストまたは同様のものを表示するにはどうすればよいですか? 皆さん、ありがとうございました。
3 に答える
JTable内にLabel を表示するのではなく、JTable を表示します。
コンテナーから table 要素を削除し、メッセージを含む Jlabel を追加してみてください。
ユーザーが別のクエリを実行し、肯定的な結果が得られた場合は、反対の方法を実行します (ラベルを削除し、テーブルを追加します)。
通常どおりにモデルにテキストを追加してから、カスタムレンダラーを作成します。何かのようなもの:
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.getColumnModel().getColumn(???).setCellRenderer( centerRenderer );
または、文字列データを含むすべての列を中央に配置する場合は、次を使用できます。
table.getDefaultRenderer(class.String);
次に、そのレンダラーの配置をリセットします。
編集:私は質問を読み間違えました。
テーブルにメッセージを表示するだけの場合は、テーブルのTableModelを変更して、エラーメッセージを含む単一行の単一列テーブルを表示することができます。この列では、カスタムレンダラーを使用する必要があります。
モデルをリセットするには、次のようにします。
DefaultTableModel model = new DefaultTableModel(...);
table.setModel( model );
もちろん、クエリが成功した場合は、新しいデータでモデルをリセットする必要もあります。
もう 1 つの方法:行がない場合は、行の代わりにテーブル内の適切に配置されたテキストを実際にペイントします。それを達成するために
- J/X/Table をサブクラス化し、paintComponent をオーバーライドする
テーブルがビューポート サイズに拡張されていることを確認します (つまり、tracksViewportHeight が true であり、JXTable の既定値であり、JTable に対して明示的に設定する必要があります)。
@Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (getRowCount() > 0) return; Component comp = getNoDataRenderer(); CellRendererPane rendererPane = getRendererPane(); Dimension size = getSize(); Dimension prefSize = comp.getPreferredSize(); Rectangle rect = new Rectangle((size.width - prefSize.width) / 2, size.height / 4, prefSize.width, prefSize.height); rendererPane.paintComponent(g, comp, this, rect); } private Component getNoDataRenderer() { if (noDataRenderer == null) { noDataRenderer = createNoDataRenderer(); } String localizedNoData = UIManager.getString("noData"); Component comp = noDataRenderer.getTableCellRendererComponent(this, localizedNoData != null ? localizedNoData : "No Data Available", false, false, -1, -1); Font bigger = getFont().deriveFont(Font.BOLD | Font.ITALIC, getFont().getSize2D() * 2); comp.setFont(bigger); return comp; } private DefaultTableCellRenderer createNoDataRenderer() { DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); renderer.setForeground(Color.GRAY); return renderer; } private CellRendererPane getRendererPane() { for (int i = 0; i < getComponentCount(); i++) { if (getComponent(i) instanceof CellRendererPane) { return (CellRendererPane) getComponent(i); } } return null; }
他の提案に対する利点 (おそらく、これらはもちろん私の 2 セントです :):
- コンポーネントの切り替え (ラベル vs テーブル): ユーザーを混乱させる可能性のある不連続なビジュアルの一種。空のテーブルはテーブルのままです。
- 特別な空のモデル: データ レルムでビューの問題を解決することは...最適ではありません。さらに、実際のモデルの列の状態を失わないように特別な注意を払う必要があります