Сделать JCheckbox больше..?

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

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

  • setPrefferedSize
  • setSize

Что я должен делать?..


person Christian 'fuzi' Orgler    schedule 22.01.2011    source источник


Ответы (2)


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

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 );
person camickr    schedule 22.01.2011
comment
У меня есть собственный Renderer для столбца Boolean.class.. но когда я устанавливаю значки, он не будет отображаться, и когда я нажимаю на него, на короткое время отображается обычный флажок.. - person Christian 'fuzi' Orgler; 23.01.2011
comment
Да, когда вы нажимаете на него, отображается редактор, поэтому вам нужен и собственный рендерер, и редактор. Если значки не отображаются, ваш пользовательский код не работает. Попробуйте сначала использовать средство визуализации и редактор по умолчанию, чтобы понять концепцию. Затем, если вы все еще чувствуете, что вам нужен собственный рендерер и редактор, вы можете изменить оба. - person camickr; 23.01.2011
comment
Почему? Код не изменяет средство визуализации, а только значки, используемые средством визуализации. - person camickr; 23.01.2011
comment
Это было много кода для того, что, по моему мнению, должно быть возможно благодаря возможностям масштабирования в языке или ОС. - person Shervin Asgari; 04.09.2012
comment
Спасибо, camickr, решение, которое вы разместили, очень крутое. Я пробовал целую кучу других вещей и потерпел неудачу, ваше решение было единственным, которое сработало правильно. - person jadrijan; 16.10.2012

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

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

Я хотел использовать существующие изображения и просто применить к ним масштаб. Я уже масштабирую шрифт своего приложения, используя настройки пользовательского интерфейса по умолчанию, поэтому у меня довольно большой шрифт. Я задавался вопросом, могу ли я использовать это и соответствующим образом масштабировать флажки.

Порыскав в интернете и перепробовав кучу вещей, я придумал этот метод:

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);
}

Что он делает, так это получает размер шрифта из метрик шрифта флажка. Затем, используя это, он получает новый значок на основе значка, найденного в «Внешний вид».

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

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

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

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

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

person Pow-Ian    schedule 18.11.2014
comment
Отличная работа, спасибо! Я использую внешний вид Windows, и пока он работает. Единственным недостатком является то, что вы не получаете эффектов наведения мыши, которые вы получаете с обычными флажками Windows 7. Обычно, когда вы указываете на флажок, он светится синим цветом. Но вы теряете этот эффект, когда используется этот метод масштабирования. - person Michael; 15.02.2017