Не удержался, чтобы принять этот вопрос как возможность поиграть с новым jdk7 api: -)
Переопределить paintComponent определенно - это хорошее решение. Тем не менее, он требует создания подклассов, чтобы просто нарисовать что-то в заданном месте поверх чего-то другого. Старым способом сделать это будет JLayeredPane (с которым трудно справиться). Новый jdk имеет компонент JLayer, который позволяет сделать это (и многое другое) простым украшением компонента. Вот фрагмент кода:
- имеет метку с базовым изображением и украшает ее стандартным JLayer
- добавляет изображение "player" на стеклянную панель слоя
- использует DragLayout Роба (установленный на стеклянной панели) для перемещения игрока по голому интерфейсу с двумя ползунками
Рабочий код (отсутствует какая-то внешняя плита котла, у всех вас есть свои шаблоны, чтобы вставить это в:)
// to please Andrew :)
JLabel fooLabel = new JLabel(new ImageIcon(ImageIO.read(
new URL("http://pscode.org/media/stromlo2.jpg"))));
final JLayer<JLabel> layer = new JLayer<JLabel>(fooLabel);
final JLabel player = new JLabel(new CursorIcon(30));
// to please myself (never-ever use a null layout :)
layer.getGlassPane().setLayout(new DragLayout());
layer.getGlassPane().add(player);
layer.getGlassPane().setVisible(true);
final JSlider horizontal = new JSlider(0, fooLabel.getPreferredSize().width, 0);
final JSlider vertical = new JSlider(JSlider.VERTICAL, 0, fooLabel.getPreferredSize().height, 0);
vertical.setInverted(true);
ChangeListener l = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
player.setLocation(horizontal.getValue(), vertical.getValue());
layer.revalidate();
}
};
horizontal.addChangeListener(l);
vertical.addChangeListener(l);
Быстрый значок:
public static class CursorIcon implements Icon {
private int size;
public CursorIcon(int size) {
this.size = size;
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.setColor(Color.red);
g.drawLine(size/2,y,size/2,size);
g.drawLine(x,size/2,size,size/2);
}
@Override
public int getIconWidth() {
return size;
}
@Override
public int getIconHeight() {
return size;
}
}
Для более ранних версий jdk доступен подпроект SwingLabs JXLayer