Vic*_*una 4 java swing custom-component
我正在使用DrawPad 示例在 Model 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);
}
}
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
画板
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;
}
}
Run Code Online (Sandbox Code Playgroud)
更改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
}
Run Code Online (Sandbox Code Playgroud)
同样,在 中uninstallUI,您应该取消引用您拥有的任何强引用并卸载您的侦听器
@Override
public void uninstallUI(JComponent c) {
// Uninstall any listeners
drawPad = null;
}
Run Code Online (Sandbox Code Playgroud)
查看自定义 java Swing 组件模型、UIDelegate、组件格式以获取完整实现。
此外,您永远不应该维护Graphics2D对不是您自己创建的上下文的引用
| 归档时间: |
|
| 查看次数: |
775 次 |
| 最近记录: |