Bunu bir AWT klibi ile yapabilirsiniz. Dışlamak istediğiniz dikdörtgenin sınırlarını ve çizim alanınızın dış sınırlarını bilmeniz gerekir.
Aşağıdaki demo kodu bir çerçeve açar ve içine tek bir panel görüntüler. Panelin boya metodu, ortada dikdörtgen bir delik bulunan dikdörtgen gibi görünen bir örnek klibi, aslında dışlamak istediğimiz alanın etrafındaki alanı tanımlayan bir poligon oluşturuyor. klip dikdörtgen dışlanan dikdörtgenin ve çizim alanının dış kenarı sınırları oluşmalıdır, ama basit tutmak ve işleyişini daha iyi göstermek için sabit kodlu değerler bıraktım (umarım!)
+-------------------+
| clip drawing area |
+---+-----------+ |
| | excluded | |
| | area | |
| +-----------+ |
| |
+-------------------+
Bu yöntem o dışlanmış sahasına girmeden tüm AWT boyama önlediğini elle hat kesişim hesaplanması üzerine yararı vardır. Bunun senin için yararlı olup olmadığını bilmiyorum.
Benim demo sonra tüm alanı üzerinde siyah bir dikdörtgen boyalar ve tek beyaz diyagonal çizgi klip çalışma göstermek için, üzerinden çalışan.
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);
}
}
Teşekkürler, mükemmel! – tuler
+1 - Benimkinden çok daha iyi :) – banjollity
Alan yöntemi okunabilirlik ve genişletilebilirlik açısından daha iyidir (dışına herhangi bir şekil ve klip oluşturabilir) ancak bazı performans sorunları olabileceğini düşünüyorum (Alan sınıfı biraz üstte belki). Klibi bir çok kez çizmeniz gerekiyorsa ve diğer yöntemin daha hızlı olup olmadığına bakın. –