2011-01-22 5 views

답변

3

난 당신이 더 큰 체크 박스를 원하는 뜻 가정 ..

  • setPrefferedSize
  • 에는 setSize 어떻게해야합니까

? 그것을 시도했다. 그렇다면 확인란을 선택하지 않은 아이콘을 나타내는 이미지를 만들어야합니다. 그런 다음이 아이콘을 사용하여 렌더러와 편집기를 만들 수 있습니다. 마지막으로 테이블의 각 행의 높이를 늘려야합니다.

Icon normal = new ImageIcon(...); 
Icon selected = new ImageIcon(...); 
JTable table = new JTable(...); 
table.setRowHeight(...); 

TableCellRenderer renderer = table.getDefaultRenderer(Boolean.class); 
JCheckBox checkBoxRenderer = (JCheckBox)renderer; 
checkBoxRenderer.setIcon(normal); 
checkBoxRenderer.setSelectedIcon(selected); 

DefaultCellEditor editor = (DefaultCellEditor)table.getDefaultEditor(Boolean.class); 
JCheckBox checkBoxEditor = (JCheckBox)editor.getComponent(); 
checkBoxEditor.setIcon(normal); 
checkBoxEditor.setSelectedIcon(selected); 
+0

나는 Boolean.class 컬럼에 대한 내 자신의 렌더러를 가지고 ...하지만 난이 표시되지 않습니다 아이콘을 설정할 때 나는 그것을 클릭하면, 그것은 짧은 두 번째 정상 체크 박스가 표시됩니다 .. –

+0

네, 클릭하면 "편집기"가 표시되어 사용자 정의 렌더러와 편집기가 모두 필요한 것입니다. 아이콘이 표시되지 않으면 사용자 정의 코드가 작동하지 않습니다.먼저 기본 렌더러와 편집기를 사용하여 개념을 이해하십시오. 그런 다음 사용자 정의 렌더러와 편집기가 필요하다고 생각되면 둘 다를 변경할 수 있습니다. – camickr

+0

하지만 다시 defaultcelleditor 설정해야합니까? –

3

중요 참고 : 코드는 같을 수 이것은 단지 기본 '금속'모양과 느낌으로 테스트되었습니다. 다른 모양과 느낌을 위해 작동한다고 보장 할 수는 없습니다. 또한 나는 그것이 확실히 약간의 해킹이기 때문에 그것이 어떻게 작동하는지 완전히 모르겠습니다.

나는 이것을 약간 다른 방식으로 해결할 수있었습니다.

기존 이미지를 사용하고 스케일을 적용하기를 원했습니다. 이미 UI 기본값을 사용하여 응용 프로그램의 글꼴 크기를 조절하고 있으므로 다소 큰 글꼴이 있습니다. 나는 그것을 활용하고 체크 박스를 적절하게 확장 할 수 있을지 궁금해했다.

인터넷을 수색하고 물건을 잔뜩 시도 후 나는이 방법을 함께했다 :

public static void scaleCheckBoxIcon(JCheckBox checkbox){ 
    boolean previousState = checkbox.isSelected(); 
    checkbox.setSelected(false); 
    FontMetrics boxFontMetrics = checkbox.getFontMetrics(checkbox.getFont()); 
    Icon boxIcon = UIManager.getIcon("CheckBox.icon"); 
    BufferedImage boxImage = new BufferedImage(
     boxIcon.getIconWidth(), boxIcon.getIconHeight(), BufferedImage.TYPE_INT_ARGB 
    ); 
    Graphics graphics = boxImage.createGraphics(); 
    try{ 
     boxIcon.paintIcon(checkbox, graphics, 0, 0); 
    }finally{ 
     graphics.dispose(); 
    } 
    ImageIcon newBoxImage = new ImageIcon(boxImage); 
    Image finalBoxImage = newBoxImage.getImage().getScaledInstance(
     boxFontMetrics.getHeight(), boxFontMetrics.getHeight(), Image.SCALE_SMOOTH 
    ); 
    checkbox.setIcon(new ImageIcon(finalBoxImage)); 

    checkbox.setSelected(true); 
    Icon checkedBoxIcon = UIManager.getIcon("CheckBox.icon"); 
    BufferedImage checkedBoxImage = new BufferedImage(
     checkedBoxIcon.getIconWidth(), checkedBoxIcon.getIconHeight(), BufferedImage.TYPE_INT_ARGB 
    ); 
    Graphics checkedGraphics = checkedBoxImage.createGraphics(); 
    try{ 
     checkedBoxIcon.paintIcon(checkbox, checkedGraphics, 0, 0); 
    }finally{ 
     checkedGraphics.dispose(); 
    } 
    ImageIcon newCheckedBoxImage = new ImageIcon(checkedBoxImage); 
    Image finalCheckedBoxImage = newCheckedBoxImage.getImage().getScaledInstance(
     boxFontMetrics.getHeight(), boxFontMetrics.getHeight(), Image.SCALE_SMOOTH 
    ); 
    checkbox.setSelectedIcon(new ImageIcon(finalCheckedBoxImage)); 
    checkbox.setSelected(false); 
    checkbox.setSelected(previousState); 
} 

를 그것이 무엇을하는 체크 박스의 폰트 메트릭스에서 글꼴의 크기를 얻을 수 있습니다. 그런 다음 'Look & Feel'에있는 아이콘을 기반으로 새 아이콘을 파생시킵니다.

설명 할 수없는 이상한 점은 각 속성을 가져 오기 위해 동일한 속성에 액세스 할 때 '선택되지 않음'또는 기본 상태의 확인란의 아이콘이 'selected'아이콘으로 변경되는 방식입니다. 하나.

컨트롤의 상태를 저장하여 시작하므로 마지막에 복원 할 수 있습니다. 아이콘을 올바르게 설정하려면 UIManager에서 아이콘을 처음 요청할 때 상태를 선택 해제해야하고 두 번째로 아이콘을 요청할 때 선택을 확인해야합니다 '아이콘.

단일 체크 상자의 'selected'값을 설정하여 동일한 속성을 호출 할 때 UIManager가 작동하는 방식이나 확인란 아이콘이 변경되는 이유를 모르겠지만 두 가지 모두를 얻으려면 필요한 것입니다. 필요한 아이콘.

글꼴의 크기를 지정하지 않으려면 높이 및 너비를 매개 변수로 전달하고 버퍼링 된 이미지 크기를 설정할 때 글꼴 높이 대신 사용하십시오.

I might mention that this same methodology works with radiobuttons

+0

위대한 작품, 고마워요! 나는 윈도우의 룩앤필을 사용하고 있으며, 지금까지는 나를 위해 일한다. 유일한 단점은 정상적인 Windows 7 체크 박스로 "마우스 오버"효과를 얻지 못한다는 것입니다. 일반적으로 체크 상자를 가리키면 파란색으로 빛납니다. 그러나이 스케일링 방법을 사용할 때 그 효과가 사라집니다. – Michael