2012-03-23 11 views
0

Ich habe ein JPanel, die benutzerdefinierten einen Hintergrund zeichnen implementiert zeichnen. Darüber hinaus kann die Anwendung JButtons platzieren, um Klicks auf bestimmte Bereiche des JPanels zu erkennen. Wenn Sie jedoch die (nicht deckenden) Schaltflächen mit der Maus markieren, werden die zugrunde liegenden JPanel-Grafiken allesamt glitschig.Graphics Glitches mit JPanel des benutzerdefinierten Zeichnen mit JButtons

My game

Diese sind JPanels 9 mit der benutzerdefinierten Zeichnung, jeweils mit 2 Füllung JButtons (R und L). Der obere rechte Block und diejenigen, die so aussehen, sind "frisch". Unten rechts hat beide Tasten hervorgehoben, die mittlere nur die ‚R‘ usw.

Ich schaffe meine Knöpfe wie folgt aus:

rotatePanel = new JPanel(); 
     rotatePanel.setOpaque(false); 
     GridLayout rotateLayout = new GridLayout(1, 2); 
     rotatePanel.setLayout(rotateLayout); 

     rotateRight = new JButton("R"); 
     rotateRight.addActionListener(this); 
     rotateRight.setOpaque(false); 
     rotateRight.setContentAreaFilled(false); 
     rotateRight.setBorderPainted(false); 
     rotatePanel.add(rotateRight); 

     rotateLeft = new JButton("L"); 
     rotateLeft.addActionListener(this); 
     rotateLeft.setOpaque(false); 
     rotateLeft.setContentAreaFilled(false); 
     rotateLeft.setBorderPainted(false); 
     rotatePanel.add(rotateLeft); 

und dies ist meine Zeichnung Code:

  public void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    Rectangle clipRect = g.getClipBounds(); 
    clipRect.grow(-4, -4); 

    int thirdWidth = clipRect.width/3; 
    int thirdHeight = clipRect.height/3; 
    for (int x = 0; x < Board.DIM; x++) { 
     //Draw the columns 
     for (int y = 0; y < Board.DIM; y++) { 
      //Draw the rows 
      g.drawRect(thirdWidth * x, thirdHeight * y, thirdWidth, thirdHeight); 
     } 
    } 

    g.setColor(Color.BLACK); 
    g.drawRect(0, 0, clipRect.width, clipRect.height); 
} 

Antwort

2

Wenn Änderungen an einem Kind Bestandteil Ihres Panels benötigen nur durch diese Komponente das Gebiet muss überlappt neu gezeichnet, werden gezogen werden. Wenn Sie g.getClipBounds() tun, erhalten Sie die zu bemalende Region, nicht die Grenzen Ihres gesamten Panels. Sie wollen wahrscheinlich nur getWidth() und getHeight() verwenden.

+0

Ah, natürlich. Jetzt habe ich auch etwas Neues über Java-Malen gelernt;) Danke! –

+0

+1 Ich wusste nicht, was g.getClipBounds() tat. – david

0

Ich bin nicht sicher, warum, aber eine Action auf die Schaltfläche Hinzufügen, die ein erneutes Zeichnen der Platte zwingt scheint zu helfen:

rotateLeft.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent e) { 
     rotatePanel.repaint(); // rotatePanel must be final to be used here 
    } 

}); 

Solange ich den Knopf der Linien sind nicht sichtbar halten, aber wenn die actionListener wird ausgelöst, dann werden die Zeilen neu gezeichnet.

Sie könnten auch einen Mouselistener für die rotateLeft Taste verwenden, die einen Neuaufbau der Komponenten auf die Ereignisse mouse, mouse und mouseClicked zwingt. Dann sollten die Linien auch sichtbar sein, wenn die Maustaste gedrückt gehalten wird.

+0

Das funktioniert, aber ist eine Art Hacky-Methode; Das Problem mit meinem Code ist, dass er im falschen Bereich neu malt, Ihre Lösung besteht darin, im richtigen Bereich neu zu zeichnen, anstatt einfach nicht den falschen zu zeichnen. –

Verwandte Themen