Hallo zusammen,
habe gerade eine Übung gemacht, bei der in einem Fenster Kreise gezeichnet werden und ein weiteres zur Einstellung dient. Das Programm wird stetig weiterentwickelt, sodass nun auf Knopfdruck ein weiteres Fensterpaar geöffnet werden soll. Mein Problem besteht nun darin, dass das erste Fenster daraufhin das Zeichnen beendet. Das ganze Programm versuche ich nach dem MVC Muster umzusetzen. Für Hilfe wäre ich dankbar.
PS: Wenn ich beim Drücken des Button einen neuen Controller erzeuge, dann funktioniert es. Aber wieso nicht so, komme nicht dahinter.
habe gerade eine Übung gemacht, bei der in einem Fenster Kreise gezeichnet werden und ein weiteres zur Einstellung dient. Das Programm wird stetig weiterentwickelt, sodass nun auf Knopfdruck ein weiteres Fensterpaar geöffnet werden soll. Mein Problem besteht nun darin, dass das erste Fenster daraufhin das Zeichnen beendet. Das ganze Programm versuche ich nach dem MVC Muster umzusetzen. Für Hilfe wäre ich dankbar.
Java:
public class View extends JFrame {
private DrawPanel panel;
private Model model;
public View(Model model){
super("Circle Drawing");
this.model = model;
setSize(400,300);
panel = new DrawPanel();
add(panel);
addComponentListener(new ComponentAdapter(){
public void componentResized(ComponentEvent e){
Dimension dim = getSize();
model.resize(dim);
}
});
setVisible(true);
}
private class DrawPanel extends JComponent{
protected void paintComponent(Graphics g){
g.drawOval(model.getX(),model.getY(),20,20);
}
}
}
Java:
public class Controller implements Runnable {
private Model model;
private View view;
private OptionView options;
private Thread thread;
private Thread thread2;
private boolean running = false;
public Controller(){
model = new Model();
view = new View(model);
options = new OptionView(view, "Optionen", model);
options.getCmdNew().addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
newWindow();
}
});
}
public void newWindow(){
model = new Model();
view = new View(model);
options = new OptionView(view, "Optionen", model);
thread2 = new Thread(this);
thread2.start();
}
public void simulate(){
running = true;
thread = new Thread(this);
thread.start();
}
public void run(){
while(running){
model.generateData();
view.repaint();
try {
Thread.sleep(model.getSleep());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Java:
public class OptionView extends JDialog {
private JSlider slider;
private Model model;
private JButton cmdNewWindow;
public OptionView(JFrame father, String title, Model model){
super(father, title);
this.model = model;
setModal(false);
setSize(400,100);
setLocation(450,100);
setLayout(new FlowLayout());
slider = new JSlider(JSlider.HORIZONTAL, 20, 200, 30);
cmdNewWindow = new JButton("Neues Fenster");
add(slider);
add(cmdNewWindow);
slider.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e){
int value = slider.getValue();
model.setSleep(value);
}
});
setVisible(true);
}
public JButton getCmdNew(){
return cmdNewWindow;
}
}
Java:
public class Model {
private int x;
private int y;
private int width;
private int height;
private int sleep = 30;
public Model(){
width = 400;
height = 300;
x = (int)(Math.random() * width);
y = (int)(Math.random() * height);
}
public int getX(){
return x;
}
public int getY(){
return y;
}
public int getSleep(){
return sleep;
}
public void setSleep(int sleep){
this.sleep = sleep;
}
public void resize(Dimension size){
width = size.width;
height = size.height;
}
public void generateData(){
x = (int)(Math.random() * width);
y = (int)(Math.random() * height);
}
}
PS: Wenn ich beim Drücken des Button einen neuen Controller erzeuge, dann funktioniert es. Aber wieso nicht so, komme nicht dahinter.
Java:
public class Controller implements Runnable {
private Model model;
private View view;
private OptionView options;
private Thread thread;
private boolean running = false;
public Controller(){
model = new Model();
view = new View(model);
options = new OptionView(view, "Optionen", model);
options.getCmdNew().addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
Controller c = new Controller();
c.simulate();
}
});
}
public void simulate(){
running = true;
thread = new Thread(this);
thread.start();
}
public void run(){
while(running){
model.generateData();
view.repaint();
try {
Thread.sleep(model.getSleep());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Zuletzt bearbeitet: