Sounds like you need font.canDisplay(char)?
https://docs.oracle.com/javase/8/doc.../awt/Font.html
That's the easy part. I would imagine the second part would be quite a challenge. I can't think of any way to do that except for custom drawing of all the text in paintComponent(). Draw some of the string with the user's font, switch to your custom font for a non-displayable character and draw that, then switch back to the user's font, etc. But once you commit to that, then you get to do your own word wrapping, left/center/right alignments, etc.
I might be overthinking it though, and there just might be something out there I'm not aware of that could make it more simple. But I'm at a loss.