2010-05-28 11 views
9

아이콘이있는 JLabel의 경우 setHorizontalTextPosition(SwingConstants.LEADING)이면 레이블의 넓이에 관계없이 텍스트 바로 뒤에 아이콘이 그려집니다.JLabel의 아이콘을 오른쪽 정렬하는 방법은 무엇입니까?

각 항목의 텍스트 길이에 따라 아이콘이 모든 장소에 표시되므로 특히 목록에 좋지 않습니다.

코드를 추적 한 결과 SwingUtilities#layoutCompoundLabelImpl에 텍스트 너비는 SwingUtilities2.stringWidth(c, fm, text)으로 설정되고 아이콘 x는 레이블 너비를 고려하지 않고 텍스트를 따르도록 설정되어있는 것으로 보입니다.

import java.awt.*; 
import javax.swing.*; 

public class TestJLabelIcon 
{ 
    public static void main(String args[]) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       JLabel c = new JLabel("abc"); 
       c.setHorizontalTextPosition(SwingConstants.LEADING); 
       c.setHorizontalAlignment(SwingConstants.LEADING); 
       c.setIcon(UIManager.getIcon("FileChooser.detailsViewIcon")); 
       c.setBorder(BorderFactory.createLineBorder(Color.RED)); 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.getContentPane().add(c);  
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

당신은 그 라벨이 항상 프레임을 채 웁니다 아이콘이 머물러 볼 수 있습니다 여기에

은 간단한 경우입니다. 두 인수를 TRAILING으로 설정하면 미러 문제가 발생합니다.

UI를 재정의하거나 JPanel 등을 사용할 수 있음을 알고 있습니다. JLabel에서 간단한 것을 놓치고 있는지 궁금합니다. 그렇지 않으면 Java 버그처럼 보입니다.

FYI Windows XP의 경우 jdk1.6.0_06입니다.

답변

12

원하는 효과입니까?

부록 : 패널이 가장 좋은 방법이라고 생각합니다.

image

import java.awt.*; 
import javax.swing.*; 

public class TestJLabelIcon { 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setLayout(new GridLayout(0, 1)); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(createPanel("abc")); 
       frame.add(createPanel("defghij")); 
       frame.add(createPanel("klmn")); 
       frame.add(createPanel("opq")); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

      private JPanel createPanel(String s) { 
       JPanel p = new JPanel(new BorderLayout()); 
       p.add(new JLabel(s, JLabel.LEFT), BorderLayout.WEST); 
       Icon icon = UIManager.getIcon("FileChooser.detailsViewIcon"); 
       p.add(new JLabel(icon, JLabel.RIGHT), BorderLayout.EAST); 
       p.setBorder(BorderFactory.createLineBorder(Color.blue)); 
       return p; 
      } 
     }); 
    } 
} 
+0

Nop는, 나는 텍스트가 왼쪽 정렬이 오른쪽 정렬 아이콘을해야합니다. –

+0

아, 무슨 뜻인지 알 겠어. – trashgod

20

당신은 사용해야

label1.setHorizontalTextPosition (SwingConstants.LEFT를);

내가이 일을 훨씬 쉽게 방법을 발견

5

(아이콘을 기준으로 텍스트의 위치를 ​​설정). 나는 JTable에서 이런 종류의 레이아웃을 가질 필요가 있었고, 텍스트 너비를 얻은 다음 텍스트와 아이콘 사이의 너비를 수동으로 설정하여 오른쪽 정렬을 수행했습니다. 나는

public class FixedWidthRenderer extends DefaultTableCellRenderer 
{ 
    ... 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, 
     boolean isSelected, boolean hasFocus, int row, int column) 
    { 
     ... 
     FontMetrics met = super.getFontMetrics(super.getFont()); 
     int width = met.stringWidth(super.getText());     
     super.setIconTextGap(DESIREDWIDTH - width); 
     ... 
    } 
} 

큰 작품 내 JTable의

을 위해하는 DefaultTableCellRenderer를 서브 클래스!
예, 실제 코드의 경우 텍스트 너비가 DESIREDWIDTH보다 크지 않은지 확인해야합니다. 가변 폭의 열이 작동하는 고정 폭없이 자동으로 오른쪽 정렬

:

@Override 
    public void setBounds(int x, int y, int width, int height) { 
     super.setBounds(x, y, width, height); 
     if (getIcon() != null) { 
      int textWidth = getFontMetrics(getFont()).stringWidth(getText()); 
      Insets insets = getInsets(); 
      int iconTextGap = width - textWidth - getIcon().getIconWidth() - insets.left - insets.right - PADDING; 
      setIconTextGap(iconTextGap); 
     } else { 
      setIconTextGap(0); 
     } 
    } 
+0

좋은 해결책. 나는 다양한 칼럼 너비로 작동하는 메소드를 추가 할 자유를 얻었다. –

관련 문제