C
Cruz
Gast
Hi.
Ich habe hier einen JFrame mit einem JPanel drauf. Auf dem JPanel sind diverse Buttons, die mit setVisible(false) und setVisible(true) unsichtbar und dann wieder sichbar gemacht werden. Irgendwie führt das dazu, dass das die repaint() Methode des JPanels immer fort neu aufgerufen wird. Wenn ich entweder das setVisible(false) bei Stelle 1 auskommentiere, oder das setVisible(true) bei Stelle 2, dann funktioniert es wie es soll und repaint()-et nicht mehr ständig. Wieso tut er das und wie kann es unterbinden?
Ich habe hier einen JFrame mit einem JPanel drauf. Auf dem JPanel sind diverse Buttons, die mit setVisible(false) und setVisible(true) unsichtbar und dann wieder sichbar gemacht werden. Irgendwie führt das dazu, dass das die repaint() Methode des JPanels immer fort neu aufgerufen wird. Wenn ich entweder das setVisible(false) bei Stelle 1 auskommentiere, oder das setVisible(true) bei Stelle 2, dann funktioniert es wie es soll und repaint()-et nicht mehr ständig. Wieso tut er das und wie kann es unterbinden?
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class RuleEditorPanel extends JPanel implements ChangeListener
{
public final static int LINE_HEIGHT = 14;
private static final int DISTINCT_RULES_SIZE = 10;
private Button[] copyButtons;
public RuleEditorPanel()
{
super();
setPreferredSize(new Dimension(240, 320));
setBackground(Color.WHITE);
setDoubleBuffered(true);
setLayout(null); // <-- right there, null layout :P
setBorder(BorderFactory.createLineBorder(Color.BLACK));
int tlx = 177;
int tly = 48;
tlx = 85;
tly = tly + 4*LINE_HEIGHT+15;
int line = 0;
copyButtons = new Button[DISTINCT_RULES_SIZE];
for (int i = 0; i < DISTINCT_RULES_SIZE; i++)
{
copyButtons[i] = new CopyButton();
copyButtons[i].setLocation(tlx, tly+line*LINE_HEIGHT);
copyButtons[i].setVisible(false);
add(copyButtons[i]);
line++;
if(i == 4)
{
tlx += 120;
line = 0;
}
}
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
int tlx = 5;
int tly = 30;
g.setColor(new Color(120,120,120, 255));
// recently used rules
tlx = 5;
tly = 30 + 4*LINE_HEIGHT+15;
int line = 0;
g.drawRect(tlx, tly, 229, 6*LINE_HEIGHT+5);
g.drawString("recently used", tlx+5, tly+LINE_HEIGHT-2);
// Hide all the buttons for now...
for (int i = 0; i < DISTINCT_RULES_SIZE; i++)
copyButtons[i].setVisible(false); // <-- Stelle 1
for (int i = 0; i < 8; i++)
{
// Draw some text
g.drawString("[30,30]", tlx+5, tly+(line+2)*LINE_HEIGHT);
// And show the button
copyButtons[i].setId(i);
copyButtons[i].setVisible(true); // <-- Stelle 2
line++;
if (i == 4)
{
tlx += 120;
line = 0;
}
}
System.out.println("repainted");
}
/**
* Listener for the sliders.
* @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent)
*/
public void stateChanged(ChangeEvent arg0)
{
repaint();
}
}