Управление макетом флажка в пользовательском Synth Look & Feel
Я пытаюсь реализовать пользовательский стиль и стиль Steampunk с использованием Synth, в основном предоставляя собственные версии SynthStyle, SynthPainter и SynthStyleFactory.
Я не использую XML, то есть все делается через API Java. В целом это работает просто отлично и на самом деле начинает выглядеть довольно прилично.
Однако у меня проблемы с некоторыми "составными" компонентами, такими как JCheckBox. Когда в SynthPainter вызывается paintCheckBoxBackground(), координаты относятся ко всей области, охватываемой JCheckBox.
Как мне определить, где в этом регионе значок флажка и текст должны быть нарисованы отдельно?
1 ответ
Хорошо, mb поможет следующее (код должен быть добавлен в ваш собственный художник, связанный с JCheckBox):
public void paintCheckBoxBackground(SynthContext context, Graphics g, int x, int y, int w, int h){
AbstractButton c = (AbstractButton) context.getComponent();
String text = c.getText();
Icon icon = c.getIcon();
if (icon == null){
icon = context.getStyle().getIcon(context, "CheckBox.icon");
};
int iconTextGap = c.getIconTextGap();
Rectangle componentRect = new Rectangle();
Rectangle iconR = new Rectangle();
Insets insets = new Insets(0, 0, 0, 0);
if (context.getRegion().isSubregion()){
insets = context.getStyle().getInsets(context, insets);
}
else{
insets = context.getComponent().getInsets(insets);
}
componentRect.x = insets.left;
componentRect.y = insets.top;
componentRect.width = c.getWidth() - (insets.left + insets.right);
componentRect.height = c.getHeight() - (insets.top + insets.bottom);
if (icon != null){
iconR.x += componentRect.x;
iconR.y += componentRect.y;
iconR.width = icon.getIconWidth();
iconR.height = icon.getIconHeight();
g.setColor(Color.GREEN);
g.fillRect(iconR.x, iconR.y, iconR.width, iconR.height);
}
if (text != null){
g.setColor(Color.RED);
int textPos = iconR.x + iconR.width + iconTextGap;
g.fillRect(textPos, iconR.y, c.getWidth() - insets.right - textPos, componentRect.height);
}
}
Пожалуйста, примите во внимание, что здесь учитывается только наиболее распространенный случай (выравнивание по левому и правому краю, текст справа от значка). Для более сложной обработки случая см. Исходный код SwingUtilities.layoutCompoundLabel