È possibile eseguire questa operazione con una clip AWT. Dovrai conoscere i limiti del rettangolo che desideri escludere e i limiti esterni dell'area di disegno.
Il seguente codice demo apre una cornice e visualizza un pannello singolo al suo interno. Il metodo paint del pannello imposta una clip di esempio che assomiglia ad un rettangolo con un buco rettangolare nel mezzo, quando in realtà è un poligono che descrive l'area intorno all'area che vogliamo escludere. Il rettangolo della clip dovrebbe essere composto dai limiti del rettangolo escluso e dal bordo esterno dell'area di disegno, ma ho lasciato i valori codificati per mantenerlo semplice e illustrare meglio il funzionamento (spero!)
+-------------------+
| clip drawing area |
+---+-----------+ |
| | excluded | |
| | area | |
| +-----------+ |
| |
+-------------------+
Questo metodo ha il vantaggio di calcolare manualmente l'intersezione della linea in quanto impedisce a tutti i dipinti AWT di entrare nell'area esclusa. Non so se ti è utile o no.
La mia demo dipinge quindi un rettangolo nero sull'intera area e una singola linea diagonale bianca che la attraversa, per illustrare il funzionamento della clip.
public class StackOverflow extends JFrame {
public static void main(String[] args) {
new StackOverflow();
}
private StackOverflow() {
setTitle("Clip with a hole");
setSize(320,300);
getContentPane().add(new ClipPanel());
setVisible(true);
}
}
class ClipPanel extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Polygon clip = new Polygon(
new int[]{ 0, 100, 100, 0, 0, 20, 20, 80, 80, 0 },
new int[]{ 0, 0, 60, 60, 20, 20, 40, 40, 20, 20 },
10
);
g.setClip(clip);
g.setColor(Color.BLACK);
g.fillRect(0,0,100,60);
g.setColor(Color.WHITE);
g.drawLine(0,0,100,60);
}
}
Grazie, perfetto! – tuler
+1 - Molto meglio del mio :) – banjollity
Il metodo Area è migliore in termini di leggibilità ed estensibilità (è possibile creare qualsiasi forma e clip al suo esterno) ma penso che potrebbe avere alcuni problemi di prestazioni (la classe Area è un po ' sopra le righe forse). Dovresti fare un benchmark se devi disegnare sulla clip molte volte e vedere se l'altro metodo è più veloce. –