2009-03-06 25 views
7

Tôi hiện đang cố gắng triển khai thành phần Swing, kế thừa từ JLabel chỉ đơn giản là đại diện cho nhãn có thể được định hướng theo chiều dọc.Xoay một JLabel Swing

Bắt đầu với điều này:

public class RotatedLabel extends JLabel { 

    public enum Direction { 
    HORIZONTAL, 
    VERTICAL_UP, 
    VERTICAL_DOWN 
    } 

    private Direction direction; 

Tôi nghĩ nó là một ý tưởng tốt đẹp để chỉ làm thay đổi kết quả từ 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(); 
    } 
    } 

và sau đó chỉ cần chuyển đổi các đối tượng Graphics trước khi tôi offload sơn đến gốc 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); 
    } 
} 

Dường như nó hoạt động — bằng cách nào đó - trong đó văn bản được hiển thị theo chiều dọc. Tuy nhiên, vị trí và kích thước bị tắt:

Thực ra, chiều rộng của nền (màu da cam trong trường hợp này) giống với chiều cao của xung quanh JFrame đó là ... không hoàn toàn là những gì tôi có trong đầu.

Bất kỳ ý tưởng nào để giải quyết điều đó theo cách phù hợp? Đang ủy quyền hiển thị cho các lớp siêu đẳng thậm chí được khuyến khích?

+0

bỏ qua "(" trong 'gr.translate0, getPreferredSize(). GetHeight());' – brownian

Trả lời

8

Tôi đã làm việc này ngay bây giờ với sự trợ giúp của đồng nghiệp. Về cơ bản, bây giờ tôi có một lĩnh vực cho biết có trao đổi chiều cao/chiều rộng mà chỉ hoạt động trong thời gian khi bản gốc của nó là 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; 
} 
+0

Bạn có thể cung cấp lớp học đầy đủ không? –

+1

Xem http://hypftier.de/dump/RotatedLabel.java - giấy phép được đề cập là một giấy phép khá tự do, được mô hình hóa sau BSD (mặc dù văn bản giấy phép chỉ có sẵn bằng tiếng Đức cho đến nay). – Joey

0

Tôi nghĩ điều đó là do bạn đang dịch sai điểm.

kích thước của đối tượng tùy thuộc vào vùng chứa bạn có, vì vậy kích thước ưa thích của bạn có thể là thứ bạn muốn, kích thước thực tế của bạn không?

nếu bạn có nhãn này ở trung tâm của một BorderLayout, kích thước luôn là kích thước đầy đủ của container (trừ bắc + chiều cao nam, trừ đông + tây chiều rộng)

do đó, không bạn phải dịch về kích thước thực tế, không phải kích thước ưa thích?

+0

Hmm ... không ... khá. Vị trí hơi lệch do căn chỉnh theo chiều dọc (theo chiều ngang) của nhãn được căn giữa, nhưng kích thước bây giờ chính xác là hình vuông. Có thể nào là siêu lớp không quan tâm đến phương thức getPreferredSize bị ghi đè của tôi và do đó tự rút ra không liên quan đến ranh giới của tôi? – Joey

2

Tôi không biết nếu nó có liên quan bởi bây giờ, Nhưng trong khi tìm kiếm điều tương tự, tôi tìm thấy một thực hiện rất tốt trong các trang web, http://macdevcenter.com/pub/a/mac/2002/03/22/vertical_text.html

Kiểm tra nó ra, nó là triển khai trên TabbedPane với văn bản dọc, Xem liệu nó có phù hợp với bạn hay không.

2

Tôi đã chơi với điều này, ban đầu nó không hoạt động tốt vì các giới hạn nhãn chính xác là hình vuông và khiến các thành phần ở bên phải nhãn thay đổi và bị che khuất. Nhưng sau đó tôi nhận ra rằng đó là vì tôi đang sử dụng JGoodies FormLayout. Nếu bạn sử dụng trình quản lý bố cục này, hãy đảm bảo bạn đặt kích thước cột thành "ưa thích" không phải là "mặc định". HTH.