服装组件错误“没有ComponentUI类”

时间:2015-10-30 00:06:48

标签: java swing custom-component

我使用DrawPad example.在模型UIDelegate中创建服装组件但是,由于某种原因,我收到错误UIDefaults.getUI() failed: no ComponentUI class。我甚至不确定我是否正确实现了Model UIDelegate。但为什么我会收到这个错误?

主要

public class Main {
    static JFrame frame;
    static JButton clearButton;
    static DrawPad drawPad;

    public static void main(String[] args) {
        UIManager.put("DrawPadUI", "BasicDrawPadUI");
        frame = new JFrame();
        drawPad = new DrawPad();
        clearButton = new JButton("Clear");
        frame.add(drawPad, BorderLayout.CENTER);

        clearButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                Graphics g = frame.getGraphics();
                g.setColor(Color.white);
                g.fillRect(0, 0, frame.getWidth(), frame.getHeight());

            }
        });
        frame.add(clearButton, BorderLayout.SOUTH);
        frame.setSize(280, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

BasicDrawPadUI

public class BasicDrawPadUI extends ComponentUI implements MouseListener, MouseMotionListener {
    Image image;
    Graphics2D graphics2D;
    int currentX, currentY, oldX, oldY;

    JFrame frame;
    JButton clearButton;

    public static ComponentUI createUI(JComponent c) {
        return new BasicDrawPadUI();
    }

    public void paintComponent(Graphics g, JComponent c) {
        if (image == null) {
            image = c.createImage(c.getWidth(), c.getHeight());
            graphics2D = (Graphics2D) image.getGraphics();
            graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
            clear(c);
        }
        g.drawImage(image, 0, 0, null);
      }

    @Override
    public void mouseDragged(MouseEvent e) {
        // TODO Auto-generated method stub
        currentX = e.getX();
        currentY = e.getY();
        if (graphics2D != null)
            graphics2D.drawLine(oldX, oldY, currentX, currentY);
        //repaint();
        oldX = currentX;
        oldY = currentY;
    }

    public void clear(JComponent c) {
        graphics2D.setPaint(Color.white);
        graphics2D.fillRect(0, 0, c.getWidth(), c.getHeight());
        graphics2D.setPaint(Color.black);
        c.repaint();
    }


    @Override
    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub
        oldX = e.getX();
        oldY = e.getY();
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }
}

DrawPad

class DrawPad extends JComponent {

    private final static String ID = "DrawPadUI";

    public DrawPad() {
        updateUI();
    }

    public void updateUI() {
        setUI(UIManager.getUI(this));
    }

    @Override
    public String getUIClassID() {
        return ID;
    }
}

1 个答案:

答案 0 :(得分:4)

UIManager.put("DrawPadUI", "BasicDrawPadUI");更改为UIManager.put("DrawPadUI", "drawpad.BasicDrawPadUI");

您需要指定UI类的完整限定类名,包括包名

  

我需要确定一下,但是当它调用createUI时,你可以获取对组件的引用

installUI覆盖ComponentUI方法,当它被调用时,保留对传递给您的组件的引用。

private DrawPad drawPad;
//...
@Override
public void installUI(JComponent c) {
    drawPad = (DrawPad) c;
    // Install required listeners and other functionality
}

同样,在uninstallUI中,您应取消引用您拥有的任何强引用并卸载您的侦听器

@Override
public void uninstallUI(JComponent c) {
    // Uninstall any listeners
    drawPad = null;
}

请查看custom java Swing component Model, UIDelegate, component format以获得完整的实施。

此外,您永远不应该保留对您自己未创建的Graphics2D上下文的引用