Sie können dies mit einem AWT-Clip tun. Sie müssen die Grenzen des auszuschließenden Rechtecks und die äußeren Grenzen des Zeichenbereichs kennen.
Der folgende Democode öffnet einen Frame und zeigt ein einzelnes Panel an. Die Malmethode des Bedienfelds erstellt einen Beispielclip, der wie ein Rechteck mit einem rechteckigen Loch in der Mitte aussieht. In Wirklichkeit ist es ein Polygon, das den Bereich um den Bereich beschreibt, den wir ausschließen möchten. Das Clip-Rechteck sollte aus den Grenzen des ausgeschlossenen Rechtecks und dem äußeren Rand des Zeichenbereichs bestehen, aber ich habe hartcodierte Werte eingegeben, um es einfach zu halten und die Funktionsweise besser zu veranschaulichen (hoffe ich!)
+-------------------+
| clip drawing area |
+---+-----------+ |
| | excluded | |
| | area | |
| +-----------+ |
| |
+-------------------+
Diese Methode hat den Vorteil, dass die Linienkreuzung manuell berechnet wird, indem verhindert wird, dass alle AWT-Zeichnungen in den ausgeschlossenen Bereich gelangen. Ich weiß nicht, ob das für dich nützlich ist oder nicht.
Meine Demo malt dann ein schwarzes Rechteck über die gesamte Fläche, und eine einzelne weiße diagonale Linie durchläuft es, um den Clip zu veranschaulichen.
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);
}
}
Danke, perfekt! – tuler
+1 - viel besser als meins :) – banjollity
Die Area-Methode ist besser in Bezug auf Lesbarkeit und Erweiterbarkeit (Sie können eine beliebige Form und Clip nach außen), aber ich denke, es könnte einige Leistungsprobleme (die Area-Klasse ist ein bisschen über die Spitze vielleicht). Sie sollten es benchmarken, wenn Sie mehrmals auf den Clip zeichnen müssen, um zu sehen, ob die andere Methode schneller ist. –