سؤال

واني اسعى حاليا لتنفيذ المكون سوينغ، وراثة من 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 المحيطة والتي هي ... ليس تماما ما كان يدور في خلدي.

وأي أفكار كيفية حل هذا بطريقة سليمة؟ وتفويض تقديم لsuperclasses حتى شجع؟

هل كانت مفيدة؟

المحلول

وأنا حصلت على العمل الآن مع القليل من المساعدة من زميل في العمل. أساسا أنا الآن لديك حقل التي تشير إلى ما إذا كان لمبادلة الطول / العرض التي تنشط فقط للمرة عندما 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;
}

نصائح أخرى

وأنا لا أعرف ما إذا كان من المناسب الآن، ولكن حين تبحث عن الشيء نفسه، ولقد وجدت التنفيذ الجيد جدا في شبكة الإنترنت، http://macdevcenter.com/pub/a/mac/2002 /03/22/vertical_text.html

والتحقق من ذلك، هو تنفيذ خلال TabbedPane مع النص العمودي، معرفة ما اذا كان لك أجنحة الأغراض.

ولقد كان اللعب مع هذا، فإنه لم يكن يعمل بشكل جيد للغاية في البداية لأن حدود التسمية كانت مربعة تماما وتسببت المكونات إلى حق التسمية لتحويل وتصبح حجبه. ولكن ثم أدركت أنه كان لأنني أستخدمه JGoodies FormLayout. إذا كنت تستخدم هذا المدير التخطيط، تأكد من تعيين حجم العمود ب "فضل" لا "الافتراضي". HTH.

وأعتقد أنه هو خارج لأنك ترجمة عن وجهة خاطئة.

وحجم الكائن يعتمد على ما حاوية لديك هذا في، حتى حين حجم المفضل لديك قد يكون ما تريد، الحجم الفعلي هو لا؟

وإذا كان لديك هذه التسمية في CENTER من BorderLayout، وحجم هو دائما الحجم الكامل للحاوية (ناقص شمال + ارتفاع الجنوب، ناقص شرقي + عرض غرب)

وحتى لا تضطر إلى ترجمة عن الحجم الفعلي، وليس حجم مفضل؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top