質問
現在、Swingコンポーネントを実装しようとしていますが、これは JLabel
を継承しているだけです。
これから始めましょう:
public class RotatedLabel extends JLabel {
public enum Direction {
HORIZONTAL,
VERTICAL_UP,
VERTICAL_DOWN
}
private Direction direction;
getPreferredSize()
の結果を変更するのは良い考えだと思いました:
@Override
public Dimension getPreferredSize() {
// swap size for vertical alignments
switch (getDirection()) {
case VERTICAL_UP:
case VERTICAL_DOWN:
return new Dimension(super.getPreferredSize().height, super
.getPreferredSize().width);
default:
return super.getPreferredSize();
}
}
そして単純に Graphics
オブジェクトを変換してから、ペイントを元の JLabel
にオフロードします:
@Override
protected void paintComponent(Graphics g) {
Graphics2D gr = (Graphics2D) g.create();
switch (getDirection()) {
case VERTICAL_UP:
gr.translate(0, getPreferredSize().getHeight());
gr.transform(AffineTransform.getQuadrantRotateInstance(-1));
break;
case VERTICAL_DOWN:
// TODO
break;
default:
}
super.paintComponent(gr);
}
テキストが縦に表示されるようになったという点で、どうやらうまくいくようです。ただし、配置とサイズはオフです。
実際には、背景の幅(この場合はオレンジ色)は周囲の JFrame
の高さと同じです。
適切な方法でそれを解決する方法はありますか?スーパークラスへのレンダリングの委任はさらに奨励されていますか?
解決
同僚の少しの助けを借りて、すぐに動作するようになりました。基本的に、元の JLabel
がペイントを行うときにのみアクティブになる高さ/幅を交換するかどうかを示すフィールドがあります。
private boolean needsRotate;
@Override
public Dimension getSize() {
if (!needsRotate) {
return super.getSize();
}
Dimension size = super.getSize();
switch (getDirection()) {
case VERTICAL_DOWN:
case VERTICAL_UP:
return new Dimension(size.height, size.width);
default:
return super.getSize();
}
}
@Override
public int getHeight() {
return getSize().height;
}
@Override
public int getWidth() {
return getSize().width;
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D gr = (Graphics2D) g.create();
switch (getDirection()) {
case VERTICAL_UP:
gr.translate(0, getSize().getHeight());
gr.transform(AffineTransform.getQuadrantRotateInstance(-1));
break;
case VERTICAL_DOWN:
gr.transform(AffineTransform.getQuadrantRotateInstance(1));
gr.translate(0, -getSize().getWidth());
break;
default:
}
needsRotate = true;
super.paintComponent(gr);
needsRotate = false;
}
他のヒント
今では関連性があるかどうかわかりませんが、 しかし、同じことを検索しているときに、Webで非常に優れた実装を見つけました。 http://macdevcenter.com/pub/a/mac/2002 /03/22/vertical_text.html
チェックしてください。これは、垂直テキストを使用したTabbedPaneの実装です。 目的に合っているかどうかを確認してください。
私はこれで遊びましたが、ラベルの境界が正確に正方形であり、ラベルの右側のコンポーネントがシフトして不明瞭になるため、最初はあまりうまくいきませんでした。しかし、それから私はJGoodies FormLayoutを使用しているためだと気付きました。このレイアウトマネージャーを使用する場合は、列サイズを「優先」に設定してください。 「デフォルト」ではありません。 HTH。
間違った点について翻訳しているため、オフになっていると思います。
オブジェクトのサイズは、これが入っているコンテナによって異なります。そのため、好みのサイズが必要なサイズかもしれませんが、実際のサイズは違いますか?
BorderLayoutのCENTERにこのラベルがある場合、サイズは常にコンテナのフルサイズ(マイナス北+南の高さ、マイナス東+西の幅)です
では、実際のサイズではなく、推奨サイズについて翻訳する必要がありますか?