Как получить как выбранный, так и не выбранный вид JCheckBox из LAF

У меня проблема, потому что я пытаюсь получить оба изображения JCheckbox, выбранные и не выбранные до сих пор. Мне удалось получить значок из UIManager, но, к сожалению, у него нет отмеченной версии? Я видел, что есть художники, которые рисуют эти значки, но если я запускаю следующий код, он дает мне NPE.

p = (Painter) UIManager.get("CheckBox[Enabled].iconPainter");
BufferedImage selected = new BufferedImage( 20, 20, BufferedImage.TYPE_INT_ARGB ) ;
p.paint((Graphics2D) selected.getGraphics(), null, 20, 20);

Кто-нибудь может помочь мне с этим?

Обновлено:

В основном p имеет значение null после метода get. Как получить как выбранный, так и не выбранный вид JCheckBox из LAF

КУЧА:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at addlayer.AddLayerUI.initOwn(AddLayerUI.java:47)
    at addlayer.AddLayerUI.<init>(AddLayerUI.java:28)
    at addlayer.AddLayerUI$1.run(AddLayerUI.java:136)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

КОД:

package addlayer;

import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import javax.swing.Icon;
import javax.swing.Painter;
import javax.swing.UIManager;

public class AddLayerUI extends javax.swing.JFrame {

    public AddLayerUI() {        
        initComponents();
        initOwn();
    }
    
    private void initOwn(){
        Icon icn ;
        icn = UIManager.getIcon("CheckBox.icon") ; //Works but gives only unchecked version of the check box, i need checked as well

        Painter p;

        p = (Painter) UIManager.get("CheckBox[Selected].iconPainter"); // returns null

        BufferedImage selected = new BufferedImage( 20, 20, BufferedImage.TYPE_INT_ARGB ) ;
        p.paint((Graphics2D) selected.getGraphics(), null, 20, 20);
    };
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate = "collapsed" desc = "Generated Code">                          
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("AddLayer - TatukGIS DK11 sample");
        setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/resources/icon.png")));
        setSize(new java.awt.Dimension(800, 600));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 800, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 601, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>                        

    public static void main(String args[]) {
        /* Set the Windows look and feel */
        //<editor-fold defaultstate = "collapsed" desc = " Look and feel setting code (optional) ">
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Windows".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(AddLayerUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(AddLayerUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(AddLayerUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(AddLayerUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>


        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new AddLayerUI().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    // End of variables declaration                   
}

@матовая краска. По-видимому, переменная p равна нулю.

Damian Hong-Minh Nguyen 05.04.2022 09:46

Мне нужно выбранное, а не выбранное состояние @matt

Damian Hong-Minh Nguyen 05.04.2022 10:03

Я сделал, это p, который равен нулю.

Damian Hong-Minh Nguyen 05.04.2022 10:05

Какой ключ у тебя работает?

matt 05.04.2022 10:09

Checkbox.Icon работал нормально, но затем мне пришлось присвоить его переменной значка и выполнить некоторые другие действия. Однако это не решает мою проблему, так как мне нужна как проверенная, так и непроверенная версия, и это дало мне только непроверенную версию.

Damian Hong-Minh Nguyen 05.04.2022 10:10

Вы проверяли этот пост? stackoverflow.com/questions/1663729/…

matt 05.04.2022 10:14

добавил недостающие детали в пост

Damian Hong-Minh Nguyen 05.04.2022 10:16

да, это дало мне null ``` Icon dsiabledCheckedIcon = UIManager.getLookAndFeel(). getDisabledSelectedIcon (новый JCheckBox(), checkedIcon); ```

Damian Hong-Minh Nguyen 05.04.2022 12:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этом примере будет использоваться пользовательский интерфейс для рисования кнопки в разных состояниях.

checkbox in 4 states of enabled/selected

(На изображении ошибка, верхний левый флажок должен быть снят.)

import javax.swing.*;
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
import java.awt.image.*;
import java.awt.*;
public class Icp{

    public static void main(String[] args){
        JCheckBox canon = new JCheckBox();
        Dimension d = canon.getPreferredSize();
        int w = (int)d.getWidth();
        int h = (int)d.getHeight();
        canon.setBounds(0, 0, w, h);
        BasicToggleButtonUI ui = (BasicToggleButtonUI)UIManager.getUI( canon );
        
        
        BufferedImage img = new BufferedImage(2*w, 2*h, BufferedImage.TYPE_INT_ARGB);
        
        Graphics g = img.getGraphics();
        ui.paint(g, canon);
        
        g.translate( w, 0);
        canon.setSelected(true);
        ui.paint(g, canon);
        
        g.translate(-w, h);
        canon.setEnabled(false);
        canon.setSelected(false);
        ui.paint(g, canon);
        
        g.translate(w, 0);
        canon.setSelected(true);
        ui.paint(g, canon);
        
        g.dispose();

        ImageIcon ico = new ImageIcon(img);
        
        JFrame frame = new JFrame();
        JLabel icn = new JLabel( ico );
        frame.add(icn);
        frame.pack();
        frame.setVisible(true);

        System.out.println( ui );
    }
}

Я привел к BasicToggleButtonUI, потому что у него есть метод значка, но он защищен.

Другие вопросы по теме