4

JTable から出てくるオブジェクトをその上に重ねて配置したいので、JLayeredPane を使用するのは自然なことのように思えます。ただし、これを適切にペイントする、ヘッダーを適切に行うなどは非常に困難です。これを行うにはどうすればよいですか:

  • 行ヘッダーが表示され、スクロールすると一致します
  • 列ヘッダーが表示され、スクロールすると一致します
  • テーブルは適切に描画されます
  • サイズ変更によってすべてが台無しになるわけではありません

JDesktopPaneextendsであるためJLayeredPane、この質問への回答では、 のJTable背後に (または他のコンポーネント)を持つこともできることに注意してくださいJDesktopPane

4

1 に答える 1

4

類似しているが同一ではない質問: Java - Is it possible to put a JLayeredPane inside JScrollPane? JScrollPaneとJLayeredPane を使用して JTable セルとSwing GUI デザインにアニメーションを表示する方法。

これを適切に行うには、サイジング、ヘッダー、UI の変更という 3 つの個別の問題を考慮する必要があります。

サイジング

適切にスクロールしてペイントするにJScrollPaneは、その中のコンポーネント (この場合はJLayeredPane. Componentただし、他の がテーブルの上に浮いているため、テーブルによってサイズを設定する必要があります。この場合、最も簡単な方法は、JTable次のように JLayeredPane デリゲート サイズ関連のプロパティを作成することです。

final JTable table = new JTable();
JLayeredPane layers = new JLayeredPane() {
  @Override
  public Dimension getPreferredSize() {
    return table.getPreferredSize();
  }

  @Override
  public void setSize(int width, int height) {
    super.setSize(width, height);
    table.setSize(width, height);
  }

  @Override
  public void setSize(Dimension d) {
    super.setSize(d);
    table.setSize(d);
  }
};
// NB you must use new Integer() - the int version is a different method
layers.add(label, new Integer(JLayeredPane.PALETTE_LAYER), 0);
JScrollPane scrolling = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                                        JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrolling.setViewportView(layers);

JTableを のサイズを決定するものにしたくない場合はJLayeredPane、他の方法で決定する必要があり、テーブルのサイズも決定する必要があります。どちらも明示的にそれらを必要setPreferredSize()とし、それらを呼び出します。setSize()

ヘッダー

JTable はもはやビューポートではないため、ヘッダーを自分でリンクする必要があります。次のコードが機能します。

scrolling.setColumnHeaderView(table.getTableHeader());
scrolling.setRowHeaderView(rowHeader);

UI

configureEnclosingScrollPane()また、 JTable はとで厄介なコードを実行することに注意してくださいconfigureEnclosingScrollPaneUI()。UI スタイルの変更を適切に機能させたい場合は、これらのメソッドをオーバーライドする必要がありますが、これを行う方法はまだわかっていません。

于 2011-07-12T11:49:29.577 に答える