Сделать JCheckbox больше ..? - PullRequest
3 голосов
/ 22 января 2011

Я хочу сделать мои JCheckboxes в JTable больше (для сенсорного экрана), но это не меняет размер.

Я пробовал это с

  • setPrefferedSize
  • setSize

Что мне делать? ..

Ответы [ 2 ]

4 голосов
/ 22 января 2011

Полагаю, вы имеете в виду, что хотите установить флажок побольше. Если это так, то вам нужно создать изображения, чтобы представить невыбранные и выбранные значки флажка. Затем вы можете создать рендер и редактор, используя эти значки. Наконец, вам нужно увеличить высоту каждой строки в таблице. Код может выглядеть примерно так:

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 );
3 голосов
/ 18 ноября 2014

ВАЖНОЕ ПРИМЕЧАНИЕ: это было проверено только с «металлическим» внешним видом по умолчанию.Я не гарантирую, что это будет работать для любого другого внешнего вида.Кроме того, я не совсем уверен, как это работает, потому что это, по общему признанию, немного хак.

Я смог решить это немного по-другому.

Я хотел использоватьсуществующие изображения и просто применить масштаб к нему.Я уже масштабирую шрифт моего приложения, используя настройки по умолчанию для 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 and Feel».

Одна странная вещь, которую я не могу объяснить, это то, как значок для флажка в его «невыбранном»'или состояние по умолчанию, меняется на значок' выбранный ', когда я получаю доступ к одному и тому же свойству, чтобы получить каждый из них.

Я начинаю с сохранения состояния элемента управления, чтобы в конце восстановить его.Это сделано потому, что для правильной установки значков необходимо отключить состояние при первом запросе значка из UIManager, а затем его нужно будет проверить при повторном запросе значка, чтобы выбрать «выбранный».'icon.

Я не совсем уверен, как работает UIManager или почему значок флажка меняется, когда мы вызываем одно и то же свойство, просто устанавливая значение "selected" для одного флажка, но это то, что требуется вЧтобы получить оба необходимых значка.

Если вы не хотите основывать размер шрифта, вы можете просто передать в качестве параметров высоту и ширину и использовать их вместо высоты шрифта при установке буферизованногоразмер изображения.

Я мог бы упомянуть, что эта же методика работает с радиокнопками

...