Hallo,
im Rahmen einer Übungsaufgabe für die Uni soll einer GUI Leben eingehaucht werden. Das Ganze soll nach dem MVC-Konzept geschrieben werden.
Zunächst mal die Quelltexte:
Main.java
Controller.java
View.Java
Die GUI soll zwei Bilder anzeigen, auf die später Filter angewandt werden. Die Checkboxen im Menü sollen die aktivierten Filter steuern. Die Filter habe ich im Model als boolean-Werte realisiert, zum einfacheren Zugriff.
Der Fehler entseht in der Controller.Java in der von mir zum Testen eingefügten Zeile
. Aufgrund der NullPointerException nehme ich an dass das Objekt ViewModel nicht existiert, ich bekomme aber einfach nicht heraus, wie ich aus der actionPerformed() auf das beim Aufruf des Konstruktors der Controller.java erstellte ViewModel zugreifen kann.
Ich bitte um etwas Nachsicht falls das ein dummer Anfängerfehler ist, nur bin ich nunmal einer und wäre für jeden Tip dankbar
im Rahmen einer Übungsaufgabe für die Uni soll einer GUI Leben eingehaucht werden. Das Ganze soll nach dem MVC-Konzept geschrieben werden.
Zunächst mal die Quelltexte:
Main.java
Java:
public class Main {
public static void main(String[] args){
Controller MTController = new Controller();
}
}
Controller.java
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Controller implements ActionListener{
public View ViewView;
public Model ViewModel;
public Controller(){
Model ViewModel = new Model();
View ViewView = new View(this);
ViewModel.addObserver(ViewView);
ViewView.setVisible(true);
}
public static void quit(){
System.exit(0);
}
public void actionPerformed(ActionEvent event) {
String command = event.getActionCommand();
//1 = Exit
//2-9 = SetFilter
switch(Integer.parseInt(command)){
case 1: System.exit(0); break;
case 2: {
System.out.println(ViewModel.getFileName());//Hier ist der Fehler
ViewModel.setFilter(0, !(ViewModel.isFilter(0)));
System.out.println(ViewModel.isFilter(0));
}; break;
}
}
}
View.Java
Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.Observable;
import java.util.Observer;
import javax.imageio.ImageIO;
import javax.swing.*;
public class View extends JFrame implements Observer{
public View(Controller Controller){
//Variablen
String fileName = "test.jpg";
Toolkit toolkit = Toolkit.getDefaultToolkit();
//GeneralContainer
JPanel contentAll = new JPanel();
contentAll.setLayout(new BorderLayout());
//Menue
JMenuBar menuBar = new javax.swing.JMenuBar();
JMenu fileMenu = new javax.swing.JMenu("File");
JMenu filterMenu = new javax.swing.JMenu("Filters");
JMenu aboutMenu = new javax.swing.JMenu("About");
JMenuItem loadFile = new javax.swing.JMenuItem("Load File...");
JMenuItem exit = new javax.swing.JMenuItem("Exit");
JMenuItem about = new javax.swing.JMenuItem("About Medientechnik");
JFrame menu = new javax.swing.JFrame();
JSeparator trennlinie1 = new JSeparator();
//Checkboxen
JCheckBoxMenuItem blur = new JCheckBoxMenuItem("Blur");
JCheckBoxMenuItem distort = new JCheckBoxMenuItem("Distort");
JCheckBoxMenuItem sharpen = new JCheckBoxMenuItem("Sharpen");
JCheckBoxMenuItem contrast = new JCheckBoxMenuItem("Contrast");
JCheckBoxMenuItem invert = new JCheckBoxMenuItem("Invert");
JCheckBoxMenuItem bw = new JCheckBoxMenuItem("B/W");
JCheckBoxMenuItem zoom = new JCheckBoxMenuItem("Zoom");
filterMenu.add(blur);
filterMenu.add(distort);
filterMenu.add(sharpen);
filterMenu.add(contrast);
filterMenu.add(invert);
filterMenu.add(bw);
filterMenu.add(zoom);
//MenuItems einfuegen
fileMenu.add(loadFile);
fileMenu.add(trennlinie1);
fileMenu.add(exit);
aboutMenu.add(about);
menuBar.add(fileMenu);
menuBar.add(filterMenu);
menuBar.add(aboutMenu);
menu.add(menuBar);
this.setJMenuBar(menuBar);
//Buttons zu ActionListener hinzufuegen
exit.addActionListener(Controller);
blur.addActionListener(Controller);
distort.addActionListener(Controller);
sharpen.addActionListener(Controller);
contrast.addActionListener(Controller);
invert.addActionListener(Controller);
bw.addActionListener(Controller);
zoom.addActionListener(Controller);
//ActionCommands festlegen
exit.setActionCommand("1");
blur.setActionCommand("2");
//Bilder
//Variablen
JPanel pictures = new JPanel();
pictures.setLayout(new BorderLayout());
JPanel bild1 = new JPanel();
JPanel bild2 = new JPanel();
bild1.setLayout(new BorderLayout());
bild2.setLayout(new BorderLayout());
JLabel original = new JLabel("Original");
original.setHorizontalAlignment(SwingConstants.CENTER);
JLabel preview = new JLabel("Preview");
preview.setHorizontalAlignment(SwingConstants.CENTER);
JSeparator trennlinie = new JSeparator();
Image image1 = null;
Image image2 = null;
//Bilder einlesen
try {
image1 = ImageIO.read(new File(fileName));
} catch (IOException e) {
e.printStackTrace();
System.out.println("Picture 1 not found");
}
try {
image2 = ImageIO.read(new File(fileName));
} catch (IOException e) {
e.printStackTrace();
System.out.println("Picture 2 not found");
}
//Fallunterscheidung nach Bildgroesse;
float aspectRatio;
//breite
if((image1.getWidth(bild1)>=(toolkit.getScreenSize().width/2) || (image1.getHeight(bild1)>=toolkit.getScreenSize().getHeight()))){
//TODO blabla
aspectRatio = (float) image1.getWidth(bild1)/(float) image1.getHeight(bild1);
double eins = (double) image1.getHeight(bild1)/(double) toolkit.getScreenSize().height;
double zwei = (double) image1.getWidth(bild1)/(double) toolkit.getScreenSize().width;
if(eins <= zwei ){
try {
image1 = ImageIO.read(new File(fileName)).getScaledInstance((int) toolkit.getScreenSize().getWidth()/2, (int) ((toolkit.getScreenSize().getWidth()/2)/aspectRatio), Image.SCALE_DEFAULT);
} catch (HeadlessException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
else{
if(image1.getWidth(bild1)>(toolkit.getScreenSize().width)/2){
try {
image1 = ImageIO.read(new File(fileName)).getScaledInstance( (int) toolkit.getScreenSize().width/2, (int) ((toolkit.getScreenSize().getWidth()/2)/aspectRatio), Image.SCALE_DEFAULT);
} catch (HeadlessException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
else{
try {
image1 = ImageIO.read(new File(fileName)).getScaledInstance( (int) (toolkit.getScreenSize().height * aspectRatio), (int) toolkit.getScreenSize().height, Image.SCALE_DEFAULT);
} catch (HeadlessException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
image2 = image1;
JLabel picLabel1 = new JLabel(new ImageIcon(image1));
JLabel picLabel2 = new JLabel(new ImageIcon(image2));
bild1.add(picLabel1,BorderLayout.NORTH);
bild1.add(original,BorderLayout.SOUTH);
bild2.add(picLabel2,BorderLayout.NORTH);
bild2.add(preview,BorderLayout.SOUTH);
pictures.add(bild1,BorderLayout.LINE_START);
pictures.add(bild2,BorderLayout.LINE_END);
pictures.add(trennlinie,BorderLayout.PAGE_END);
contentAll.add(pictures,BorderLayout.CENTER);
//Knoepfe/untere leiste
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());
JRadioButton radio = new JRadioButton("Alle Effekte");
JLabel filters = new JLabel("Filters: ");
JButton random = new JButton("Random");
random.setEnabled(true);
JTextField filterDisplay = new JTextField(30);
filterDisplay.setEditable(false);
buttonPanel.add(radio);
buttonPanel.add(random);
buttonPanel.add(filters);
buttonPanel.add(filterDisplay);
buttonPanel.setVisible(true);
contentAll.add(buttonPanel,BorderLayout.PAGE_END);
this.setContentPane(contentAll);
this.setTitle("Medientechnik - " + fileName);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
contentAll.setPreferredSize(new Dimension(toolkit.getScreenSize()));
}
@Override
public void update(Observable o, Object obj) {
Model m = (Model) o;
}
}
Die GUI soll zwei Bilder anzeigen, auf die später Filter angewandt werden. Die Checkboxen im Menü sollen die aktivierten Filter steuern. Die Filter habe ich im Model als boolean-Werte realisiert, zum einfacheren Zugriff.
Der Fehler entseht in der Controller.Java in der von mir zum Testen eingefügten Zeile
Java:
System.out.println(ViewModel.getFileName());
Ich bitte um etwas Nachsicht falls das ein dummer Anfängerfehler ist, nur bin ich nunmal einer und wäre für jeden Tip dankbar