MoleHillRocker's Blog :: Nerding around since 1985

To content | To menu | To search

Monday, April 26 2010

It's all about Apple!

In letzter Zeit lese ich viiiele Meldungen über das iPad auf heise online und in den Kommentaren finden sich ziemlich häufig einer oder mehrere der folgenden Begriffe (Reihenfolge zufällig):
  • Sekte
  • Fanboy
  • Gängelung
  • verdongelt
  • DRM
  • proprietär
  • Jünger
  • Gott
  • Hohepriester
  • Akolythen
  • Religion
  • Gläubige
  • Lemminge
  • Schwule
  • Heiliger Vater
  • Zensur
  • iWahn
  • iSchrott
  • Ablaßhandel
  • entmündigt
  • iMännchen
  • iProll
  • iPoser
  • iFön
  • EiPott
Zum Schreien! :-D

Friday, April 9 2010

Gemeinsame Nutzung eines Models durch eine JTable und eine JComboBox

In den letzten Tagen stand ich vor dem Problem, Daten in einer JTable und einer JComboBox anzeigen zu lassen. Änderungen in der JTable sollten auf die JComboBox übertragen werden und umgekehrt. Da dies jedoch einigen Aufwand in Bezug auf die Synchronisierung der Daten bedeutet, habe ich mich schließlich entschieden ein Model zu entwickeln das von beiden genutzt werden kann.

Das Model
public class UserObjectsModel implements TableModel, ComboBoxModel, Constants {

    private List<UserObject> data;

    private List<EventListener> listenerList = new ArrayList<EventListener>();

    private int selectedIndex;

    private static UserObjectsModel model;

    private UserObjectsModel() {
        super();
        this.data = new ArrayList<UserObject>();
    }

    @Override
    public int getColumnCount() {
        return USER_TABLE_COLUMN_NAMES.length;
    }

    @Override
    public int getRowCount() {
        if(data == null)
            return 0;
        return data.size();
    }

    @Override
    public String getColumnName(int col) {
        return USER_TABLE_COLUMN_NAMES[col];
    }

    @Override
    public Object getValueAt(int row, int col) {
        UserObject userObject = null;
        try {
            userObject = data.get(row);
        }
        catch(NullPointerException npe) {
            return null;
        }
        catch(IndexOutOfBoundsException ioobe) {
            return null;
        }
        switch(col) {
            case USER_OBJECT_ID:
                return userObject.getUserId();
            case USER_OBJECT_FIRST_NAME:
                return userObject.getFirstName();
            case USER_OBJECT_SECOND_NAME:
                return userObject.getSecondName();
            case USER_OBJECT_STREET_NAME:
                return userObject.getStreetName();
            case USER_OBJECT_STREET_NUMBER:
                return userObject.getStreetNumber();
            case USER_OBJECT_ZIPCODE:
                return userObject.getZipcode();
            case USER_OBJECT_PLACE:
                return userObject.getPlace();
            default:
                return null;
        }
    }

    @Override
    public Class<? extends Object> getColumnClass(int c) {
        Object object = getValueAt(0, c);
        if(object == null)
            return Object.class;
        else
            return getValueAt(0, c).getClass();
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        return false;
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        UserObject userObject = data.get(row);
        switch(col) {
            case USER_OBJECT_ID:
                userObject.setUserId(((Integer) value).intValue());
            case USER_OBJECT_FIRST_NAME:
                userObject.setFirstName(value.toString());
            case USER_OBJECT_SECOND_NAME:
                userObject.setSecondName(value.toString());
            case USER_OBJECT_STREET_NAME:
                userObject.setStreetName(value.toString());
            case USER_OBJECT_STREET_NUMBER:
                userObject.setStreetNumber(((Short) value).shortValue());
            case USER_OBJECT_ZIPCODE:
                userObject.setZipcode(value.toString());
            case USER_OBJECT_PLACE:
                userObject.setPlace(value.toString());
        }
        fireTableDataChanged();
    }

    public void addUserObject(UserObject userObject) {
        data.add(userObject);
        fireTableDataChanged();
    }

    public void removeUserObject(int row) {
        data.remove(row);
        fireTableDataChanged();
    }

    public void removeUserObject(UserObject userObject) {
        data.remove(userObject);
        fireTableDataChanged();
    }

    public void clearUsers() {
        data.clear();
        fireTableDataChanged();
    }

    public UserObject getUser(int index) {
        return data.get(index);
    }

    public Vector<UserObject> getUsers() {
        return new Vector<UserObject>(data);
    }

    @Override
    public void addTableModelListener(TableModelListener listener) {
        listenerList.add(listener);
    }

    @Override
    public void removeTableModelListener(TableModelListener listener) {
        listenerList.add(listener);
    }

    @Override
    public Object getSelectedItem() {
        if(data.size() > 0)
            return data.get(selectedIndex);
        else
            return null;
    }

    @Override
    public void setSelectedItem(Object item) {
        for(int i = 0; i < data.size(); i++) {
            if(data.get(i).equals(item))
                selectedIndex = i;
        }
        fireContentsChanged();
    }

    @Override
    public void addListDataListener(ListDataListener listener) {
        listenerList.add(listener);
    }

    @Override
    public Object getElementAt(int idx) {
        if(idx >= 0 && idx < data.size())
            return data.get(idx);
        else
            return null;
    }

    @Override
    public int getSize() {
        return data.size();
    }

    @Override
    public void removeListDataListener(ListDataListener listener) {
        listenerList.remove(listener);
    }

    public void fireTableDataChanged() {
        fireTableChanged(new TableModelEvent(this));
    }

    public void fireTableChanged(TableModelEvent event) {
        for(EventListener listener : listenerList) {
            if(listener instanceof TableModelListener)
                ((TableModelListener) listener).tableChanged(event);
        }
    }

    public void fireContentsChanged() {
        fireContentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED,
                selectedIndex, selectedIndex));
    }

    public void fireContentsChanged(ListDataEvent event) {
        for(EventListener listener : listenerList) {
            if(listener instanceof ListDataListener)
                ((ListDataListener) listener).contentsChanged(event);
        }
    }

    public static UserObjectsModel getInstance() {
        if(model == null)
            model = new UserObjectsModel();
        return model;
    }

}


Klasse UserObject
public class UserObject {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int userId;

    @Basic
    private String firstName;

    @Basic
    private String secondName;

    @Basic
    private String streetName;

    @Basic
    private short streetNumber;

    @Basic
    private String zipcode;

    @Basic
    private String place;

    public UserObject() {
        super();
    }

    public UserObject(String firstName, String secondName, String streetName,
            short streetNumber, String zipcode, String place) {
        super();
        this.firstName = firstName;
        this.secondName = secondName;
        this.streetName = streetName;
        this.streetNumber = streetNumber;
        this.zipcode = zipcode;
        this.place = place;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSecondName() {
        return secondName;
    }

    public void setSecondName(String secondName) {
        this.secondName = secondName;
    }

    public String getStreetName() {
        return streetName;
    }

    public void setStreetName(String streetName) {
        this.streetName = streetName;
    }

    public short getStreetNumber() {
        return streetNumber;
    }

    public void setStreetNumber(short streetNumber) {
        this.streetNumber = streetNumber;
    }

    public String getZipcode() {
        return zipcode;
    }

    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }

    public String getPlace() {
        return place;
    }

    public void setPlace(String place) {
        this.place = place;
    }

    public String toString() {
        return "UserObject [ " + userId + "   " + firstName + "   " + secondName + " ]";
    }

}

Interface Constants

public interface Constants {

    public static final String[] USER_TABLE_COLUMN_NAMES = { "User-ID", "First name",
            "Last name", "Street name", "Street number", "Zip code", "Place" };

    public static final int USER_OBJECT_ID = 0;

    public static final int USER_OBJECT_FIRST_NAME = 1;

    public static final int USER_OBJECT_SECOND_NAME = 2;

    public static final int USER_OBJECT_STREET_NAME = 3;

    public static final int USER_OBJECT_STREET_NUMBER = 4;

    public static final int USER_OBJECT_ZIPCODE = 5;

    public static final int USER_OBJECT_PLACE = 6;

}

Das Model kann nun durch Aufruf der Methode #setModel(UserObjectsModel.getInstance())an die JTable/JComboBox gebunden werden.

Wednesday, February 3 2010

Warum ist mein Auto kein Transformer?

Letzte Woche habe ich noch alle ausgelacht, die ihr Auto während der starken Schneefälle hier in Furtwangen im Freien stehen hatten, da ich zu der Zeit 3 Tage im Flachland bei meiner Freundin war. Als ich am Samstag morgen wieder hier an kam, schneite es zwar auch mein Auto zu, aber "nur" mit ca. 30-40cm (im Gegensatz zu anderen mit 70-80cm). Gestern erreichte uns eine Email der Vermieterin, dass wir am kommenden Samstag morgen doch bitte unsere Autos wegstellen mögen, der Hausmeister wolle den Parkplatz bahnen.

Da habe ich noch gegrinst, weil mein Auto schön unter einem Baum stand und nur mit besagter Menge Schnee bedeckt war. Der übermotivierte Sohn des Hausmeisters schob dann einen kleinen Schneewall hinter mein Auto beim Versuch die Straße zu räumen. Man hab' ich mich aufgeregt! Soweit kein Problem, war ja nur ein kleiner Wall.

Heute setzte dann Tauwetter ein und ich dachte "Cool, muss ich nichtmal mehr viel schaufeln!", da von den Seiten schon alles abgefallen war. Als ich beim Abendessen nochmal rausgeschaut habe hat mich dann fast der Schlag getroffen. Zuerst dachte ich mein Auto wäre abgeschleppt worden, weil an seiner Stelle jetzt ein silberner Audi stand. Der komische Schneehaufen daneben fiel mir in dem Moment noch nicht weiter auf... :-S

Bei genauerem Hinsehen erkannte ich dann, dass der komplette Baum sich seiner Schneehaube entledigt hat und diese mein Auto komplett eingedeckt hat. Im Moment schaut nur noch das obere linke Eck der Windschutzscheibe heraus und das Ganze Auto ist in einem riesigen Schneeberg versteckt. Ich mach morgen oder übermorgen mal ein Foto davon, bevor ich mich ans Ausschaufeln mache. 

Edit: Hier nun endlich das Foto:


Wäre mein Auto doch nur ein Transformer, dann würde es sich einfach 2 mal schütteln und gut ist. Aber naja, in Transformers 1 blieb Bumblebee ja auch eine Weile getarnt...vielleicht dauert bei meinem Golf diese Tarnphase einfach nur ein bißchen länger (4 Jahre).

Thursday, January 21 2010

Ende der Vorlesungszeit

Ein weiterer Meilenstein im ersten Semester des Masterstudiums ist erreicht, das Ende der Vorlesungszeit. Offiziell ist es erst morgen, bei uns jedoch schon heute. Jetzt gilt es noch 3 Klausürchen zu überstehen, dann ist CSM-1 passé. Bis dahin dauert es aber noch 2 Wochen, außerdem wollen die Klausuren ja auch erst einmal mit guten Noten bewältigt bestanden werden. Darum lerne ich auch jetzt jeden fleissig Theoretische Informatik, Semantik von Programmiersprachen, Methods of Communication and Media Delivery (vom Prof gern als CoMeDy bezeichnet) und Medienwirtschaft und -management.

Schaffen wir das? Jo wir schaffen das! Booyah!

Thursday, January 7 2010

Fufunk

Seit knapp 10 Minuten ist das Campusradio der HS Furtwangen auf Sendung!

Hörbar ist das Ganze entweder über den Webplayer auf http://www.fufunk.de, oder per Shoutcast:
AAC-Stream: http://camm.dm.hs-furtwangen.de:8000/listen.pls
MP3-Stream: http://camm.dm.hs-furtwangen.de:8100/listen.pls

Ich habe mir die URLs (jeweils ohne das /listen.pls) direkt mal in Rhythmbox importiert und höre derzeit den AAC-Stream in Top-Qualität.



Da geht was an der HFU!

- page 1 of 4