0
Эй, у меня есть небольшая проблема с моей игрой в кости. Проблема в том, что i нажимаю кнопку для нового номера Dice, моя панель не перекрашивает. Я использую шаблон Observer для обновления моей панели. Мой наблюдатель отлично работает, когда я хочу обновить метку, но это не сработало, когда я хочу обновить Graphics.filloval. Кто-то знает, почему мой paintcomponent не перекрашивать ??!,Java-перекраска с Observer не сработала
Благодаря
Dice класса
public class Dice {
private int value = 0;
private java.util.List<DobbelObserver> observers;
public Dice()
{
value = 0;
observers = new ArrayList<>();
}
public int getValue()
{
return value;
}
public void ThrowDice()
{
value = new Random().nextInt(6) + 1;
System.out.println(value);
notifyObservers();
}
public void addObserver(DobbelObserver observer)
{
observers.add(observer);
}
public void notifyObservers()
{
for(DobbelObserver observer : observers)
{
observer.update();
}
}
}
Каркасные
public class DobbelFrame extends JFrame {
public DobbelFrame()
{
Dice dice = new Dice();
setTitle("Dobbelstenen");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
setFocusable(true);
setContentPane(new DobbelPanel(dice));
pack();
}
}
наблюдатель
public interface DobbelObserver {
void update();
}
панели
public class DobbelPanel extends JPanel implements DobbelObserver{
private JButton btn1;
private Dice wdice;
public DobbelPanel(Dice dice)
{
this.wdice = dice;
setPreferredSize(new Dimension(400,400));
addComponents();
addActionListeners();
dice.addObserver(this);
}
private void addComponents()
{
btn1 = new JButton("Genereer");
add(btn1);
}
public void addActionListeners()
{
btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
wdice.ThrowDice();
}
});
}
public void paintComponent(Graphics g)
{
if(wdice.getValue() == 0) {
g.drawRect(0,0,100,100);
} else if (wdice.getValue() == 1) {
g.fillOval(40, 40, 15, 15);
} else if (wdice.getValue() == 2) {
g.fillOval(75, 10, 15, 15);
g.fillOval(10, 75, 15, 15);
} else if (wdice.getValue() == 3) {
g.fillOval(75, 10, 15, 15);
g.fillOval(40, 40, 15, 15);
g.fillOval(10, 75, 15, 15);
} else if (wdice.getValue() == 4) {
g.fillOval(75, 10, 15, 15);
g.fillOval(10, 75, 15, 15);
g.fillOval(10, 10, 15, 15);
g.fillOval(75, 75, 15, 15);
} else if (wdice.getValue() == 5) {
g.fillOval(75, 10, 15, 15);
g.fillOval(10, 75, 15, 15);
g.fillOval(10, 10, 15, 15);
g.fillOval(75, 75, 15, 15);
g.fillOval(40, 40, 15, 15);
} else if (wdice.getValue() == 6) {
g.fillOval(10, 10, 15, 15);
g.fillOval(10, 75, 15, 15);
g.fillOval(75, 10, 15, 15);
g.fillOval(75, 75, 15, 15);
g.fillOval(10, 40, 15, 15);
g.fillOval(75, 40, 15, 15);
}
}
@Override
public void update()
{
repaint();
}
}
ли вы пытаетесь отлаживать и добавить точку останова в коде. Если да, изменились ли вы все правильные значения. Из кода, который вы предоставили, я бы предположил, что это может быть две вещи. Возможно, у вас нет правильной ссылки, чтобы перерисовать. Или, может быть, перерисовка даже не срабатывает. –
Я думаю, что проблема с перекрашивать, а не с уведомлением-шаблон –
о есть решить проблему с этим общественной ничтожной paintComponent (Graphics г) { super.paintComponent (г); } – user2978798