-
Gesamte Inhalte
813 -
Benutzer seit
-
Letzter Besuch
Über speedi
- Geburtstag 11.10.1986
-
Zwischenprüfung Frühjahr 2015 Fachinformatiker/in
speedi antwortete auf Dani866's Thema in Prüfungsaufgaben und -lösungen
Was ist eigentlich euere Meinung zur Aufgabe 2.12? Meiner Meinung nach erfüllt diese in keinster Weise die Anforderungen, welche man an Prüfungsfragen stellen sollte. Welcher Compiler läuft denn bitte in der Standard-Konfiguration sauber durch, wenn die benötigten Librarys noch nicht verlinkt sind? Welcher Entwickler coded sein Programm erstmal fertig bevor er die benötigten Librarys einbindet? Und was soll dass mit: "Programm ausführen" und Programm in Hauptspeicher laden. Ist das aus sicht des Computers gemeint, oder aus Sicht des Entwicklers? Der Entwickler sagt seiner IDE oder dem OS, dass das Programm ausgeführt werden soll. Aufgrund dessen wird danach das Programm geladen. Und danach ausgeführt. Je nach Sichtweise, wäre da beides nicht falsch oder richtig. Meiner Ansicht nach gehört dieser Bockmist gestrichen. Die Musterlösung ist für mich auch nach dem zehnten mal durchdenken noch nicht nachvollziehbar. [Nachtrag] Die Musterlösung trifft bestenfalls auf Entwicklung unter C,C++ zu. Aber soweit ich weiß ist die Ausbildung zum Fachinformatiker Anwendungsentwicklung doch eher Programmiersprechenneutral bzw. Java affin gehalten. -
KeyPressed wird in bestimmten Intervallen gerufen, solang der Knopf gedrückt ist. Entweder knüpfst du also deine Bewegung ganz direkt an dieses Event und bewegst deine Figur direkt über den KeyListener oder du musst auch noch das KeyReleased auswerten um die Bewegung ggf. zu stoppen - z.B. wenn die im Programm entsprechende Nebenläufigkeiten hast.
-
Kommt ganz drauf an wie die Aufgaben aussehen. Wenn du nur mit SceneBuilder ein paar FX-Oberflächen ohne Funktion erstellen sollst brauchst du kein Java dafür. Um diese Oberflächen dann aber mit Leben zu fülllen - dafür zu sorgen dass etwas passiert, wenn du auf einen Button blickst oder ähnliches wirst du um Java nicht herumkommen.
-
Da müsste man jetzt dein Protokoll detaillierter kennen. Wenn deine Datenrate recht hoch ist und du Text-Basiert arbeitest kann es natürlich sein, dass das Parsing etwas performance frisst. Was auch sein kann: Sockets buffern. Das heißt Daten werden nicht unbedingt in dem Moment geschrieben, in dem du sie in den OutputStream des Sockets ballerst. Wenn du willst, dass sicher gesendet wird kannst du ein stream.flush() machen. Ich persönlich würde bei UDP mit festen Sende-Raten arbeiten - da ja durchaus mal was verloren gehen kann und du keine Empfangsbestätigung hast. Auch würde ich schauen, dass die Packet möglichst klein sind. Letzte Anmerkung: Wenn ihr die akzeptierten Sockets des Servers von einem ThreadPool bearbeiten lasst, könnte es passieren, dass ihr im Threadpool bei vielen gleichzeitigen Verbindungen irgendwann keine freien Threads mehr habt. Wenn ihr also nicht aktiv dafür sorgt (z.B. durch nicht-blockierendes lesen) dass ein Thread wieder frei wird, habt ihr irgendwann ein Problem. Ich habe bei sowas bislang immer einfach für jede Verbindung wirklich einen eigenen Thread gemacht - ist aber vielleicht auch nicht die beste Lösung.
-
JLabel & Schriftgröße auf JFrame automatisch anpassen
speedi antwortete auf Natriumarm's Thema in Java
Du könntest - wenn du bei null-layout bleiben willst - die doLayout()-methode deines JFrames überschreiben und die Bounds der Komponenten dort setzen. Wenn du es ganz einfach machen willst errechnest du einen Faktor um den die Auflösung gestreck wird, setzt dann deine Standard-Bounds, holst dir danach die Componenten vom JFrame und verzerrst die Bounds um diesen Faktor. Das ist vielleicht (oder auch sicher) nicht ganz sauber und kein best practice, aber du solltest damit deine derzeitige Software mit überschaubaren Aufwand anpassen können. Die Schriftgröße, kannst du genau so anpassen. float faktor = 1.5f; JTextField tf = new JTextField(); tf.setFont(tf.getFont().deriveFont(faktor*tf.getFont().getSize())); -
Ohne es jetzt genau zu wisen würde ich sagen: Mit Java-Boardmitteln wird das eher nicht gehen. Vor allem dann nicht, wenn das Fenster zu einem anderen Prozess gehört. Wenn du diesen Mechanismus jedoch innerhalb deines Programmes verwenden willst solltest du dir auch mal über andere Varianten Gedanken machen. Anonsten könntenst du auch versuchen erstmal zu analysieren in welchem Zustand das Fenster ist (pixel-vergleich auf der Taskleiste). Auf die Weise hab ich mal tausendfach Schnitzel auf lokalisten.de eingesammelt^^
-
Ich nutze zum erstennen von XSDs eigentlich ganz gern speziellere Tools. Sprich sowas wie XML-Spy oder Eclipse-Link (JAXB). Damit brauchst dich mit solchen Problemen gar nicht erst rumschlagen. Mit Link lassen sich dann auch die Sourcen fürs Binding per 3-Mausklicks erzegen.
-
Du bist vielleicht hart drauf^^ Kannst du überhaupt irgendwas, was mit programmieren oder vielleicht Java zu tun hat? Ich versuchs trotzdem mal. import javax.swing.*; public class MessVer2{ // Initialisierung von Variablen. // Alle Variablen die man hier sieht sind als private und static initialisiert. // private bedeutet du kannst auf diese Variable nur innerhalb dieser Klasse zugreifen. Von einer anderen Klasse aus // ist die Variable nicht sichtbar. // static bedeutet das diese Variable nicht an eine Instanz dieser Klasse gebunden ist. Sondern für alle Instanzen die // selbe Variable benutzen. Man benötigt nicht mal eine Instanz der Klasse sondern kann direkt über die Klasse selbst // auf die Variable zugreifen. // int ist ein Datentyp. Steht für Integer. Also ganze Zahlen. Positiv wie negativ. 32bit. Wertebereich von -2^31 bis // 2^31 // "wer" ist der name der Variablen. Der Zugriff im programm erfolgt über diesen Namen. private static int wer = 0; // double ist ein Datentyp für Gleitkommazahlen mit doppelter Genauigkeit. [] Gibt an das es sich um ein Array // handeln soll private static double [] ar; // String hat nichts mit Unterwäsche zu tun - sondern ist ein komplexer Datentyp, welcher eine Zeichenkette // beliebiger Länger aufnehmen kann. private static String strAusgabe = ""; private static String strsAusgabe = ""; private static int ln; // Das ist eine Methode. Spricht ein programmbaustein den man aufrufen kann. // public bedeutet, dass diese Methode von überall aus aufgerufen werden kann. static bedeutet dass gleiche wie // oben auch // void ist der Rückgabetyp. Jede Methode hat so einen. Er steht immer vor dem Methodennamen. void ist ein // Datentyp der eigentlich keiner ist. Es bedeutet "nichts!". D.h. man braucht auch kein return. public static void array (){ // JOptionPane ist eine Klasse aus dem Swing-Framework (für grafische Oberflächen). Sie bietet Schnittstellen zum // einfachen erstellen von Dialogen. Mit der Methode showInputDialog wird ein Eingabe-Dialog erstellt und // angezeigt. Nachdem der Benutzer die Eingabe abgeschlossen hat gibt die Methode einen String zurück. // Integer.parseInt ist eine Methode welche eine String (also eine Zeichenkette) zu einer Zahl umrechnet mit der // der Computer rechnen kann. // "ln =" weist der Variable ln den Rückgabewert der parseInt-Methode zu. ln = Integer.parseInt(JOptionPane.showInputDialog(null, "Bitte geben sie die Anzahl der Werte an!")); ar = new double[ln]; } // ____________________Probiers ab hier mal selbst____________________ public static void eingabe(){ if (ln >0) { for (int i=0; i<ar.length; i++) { String strWert= JOptionPane.showInputDialog(null, "Messwert "+ +(i+1) +" von "+ar.length+" eingeben"); double wert= Double.parseDouble(strWert); ar[i] = wert; } } else { meldung(); } } public static void meldung(){ JOptionPane.showMessageDialog(null, "Sie haben noch kein Array erstellt!", "Error", JOptionPane.ERROR_MESSAGE); } public static void kleinsterwert(){ if (ln >0) { double kwrt = ar[0]; for (int i=1; i<ar.length; i++) { if (kwrt > ar[i]) { kwrt = ar[i]; } } JOptionPane.showMessageDialog(null, "Der kleinste Messwert beträgt: "+kwrt); } else { meldung(); } } public static void größterwert(){ if (ln >0) { double gwrt = ar[0]; for (int i=1; i<ar.length; i++) { if (gwrt < ar[i]) { gwrt = ar[i]; } } JOptionPane.showMessageDialog(null, "Der kleinste Messwert beträgt: "+gwrt); } else { meldung(); } } public static void ausgabe(){ if (ln >0) { for (int i=0;i<ar.length;i++) { strAusgabe = strAusgabe + Double.toString(ar[i]) + "\n"; } JOptionPane.showMessageDialog(null, "Messewerte:\n\n" + strAusgabe); strAusgabe = ""; } else { meldung(); } } public static void durchschnitt(){ if (ln >0) { double sum = 0; for (int i=0 ; i<ar.length; i++ ) { sum += ar[i]; } double dr = (sum/ar.length); dr = Math.round(dr*100.00)/100.00; JOptionPane.showMessageDialog(null, "Der durchschnitt beträgt: " + dr); return; } else { meldung(); } } public static void sortierung(){ for (int i=0 ; i<ar.length-1; i++ ) { double temp; int min = i; for (int j=i+1;j<ar.length ;j++ ) { if (ar[j] < ar[min]){ min = j; } temp = ar[min]; ar[min] = ar[i]; ar[i] = temp; } } } public static void main (String[]Args){ while (true) { char input; input = JOptionPane.showInputDialog(null, "*****Hauptmenü***** \n Z = Anzahl der Messungen eingeben \n B = Programm beenden \n \n").charAt(0); switch (input) { //case 'e' : case 'E' : eingabe(); break; case 'a' : case 'A' : ausgabe(); break; case 'z' : case 'Z' : array(); eingabe(); break; default : JOptionPane.showMessageDialog(null, "Falsche eingabe. \nBitte versuchen sie es erneut!", "Error", JOptionPane.ERROR_MESSAGE); } if (ln>0){break;} } // end of while while (true) { char input; input = JOptionPane.showInputDialog(null, "*****Hauptmenü***** \n Z = Anzahl der Messungen eingeben \n E = Eingabe \n A = Ausgabe \n D = Durchschnitt \n K = Kleinster Wert \n G = Größter Wert \n S = Sortierung \n B = Programm beenden \n \n").charAt(0); switch (input) { case 'e' : case 'E' : eingabe(); break; case 'a' : case 'A' : ausgabe(); break; case 'z' : case 'Z' : array(); eingabe(); break; case 'd' : case 'D' : durchschnitt(); break; case 'k' : case 'K' : kleinsterwert(); break; case 'g' : case 'G' : größterwert(); break; case 's' : case 'S' : sortierung(); ausgabe(); break; case 'b' : case 'B' : System.exit(1); break; default : JOptionPane.showMessageDialog(null, "Falsche eingabe. \nBitte versuchen sie es erneut!", "Error", JOptionPane.ERROR_MESSAGE); } } } }
-
File f = new File("meineDateiImProgrammverzeichnis.bla"); f.rename(new File("blbubOrdner/"+f.getName())); "Aber es gibt tatsaechlich auch File.copy hat mir nur nicht gefallen, weil man Pfade angeben muss." ?? Muss man beim verschieben nicht immer Pfade angeben? Relativ oder Absolut sollte beides gehen.
-
Ich sehe das wie flashpixx. Es gäbe auch noch die Variante mit dem String automatisch Java-Sourcecode zu erzeugen, zu kompilieren und auszuführen. Aber so richtig schön ist das nicht.
-
Bis vor kurzem ("bis das der Rost uns scheidet") Hersteller: Opel Modell: Vectra A Fahrzeugtyp: Limousine Baujahr: 1992 Leistung: 90 PS Farbe: Marsaille-Rot Metallic Laufleistung: ca. 135.000km nebenbei: Hersteller: Suzuki Modell: SV 650 S Fahrzeugtyp: Motorrad Baujahr: 2004 Leistung: 72 PS Farbe: Metallic-Schwarz Laufleistung: ca. 25.000 km bald (sobald geliefert): Hersteller: Ford Modell: Focus 1.0 EcoBoost Fahrzeugtyp: Limousine (5-Türer) Baujahr: 2012 Leistung: 125 PS Farbe: Panther-Schwarz Laufleistung: 0km
-
Für mich ist Software der gesamte "geistige Inhalt" eines IT-Systems. Ich eine Textdatei ist für mich irgendwo Software. Ein Programm ist für mich eine Software mit intelligenz. Also etwas, was etwas tun kann. Eine Worddatei tut nichts selbst - Word macht etwas mit ihr. Was das Beispiel mit Office angeht. Office ist gesamtheitlich gesehen eine Software oder genauso gesagt eine Sammlung von Programmen. Aber jedes einzelne Programm ist auch eine Software. Lustige Diskussion irgendwie.
-
Spontan würde ich vorschlagen: Dekompilieren und in Packages packen.
-
Das ist eigentlich nicht so schwer. Zum einen startest du einen Thread (z.B. class MyFileObserver) der in regelmäßigen abständen schaut ob sich der Timestamp der Datei geändert hat. In dieser Klasse, welche die Datei überwacht gibt es dann eine Liste mit ChangeListenern (entsprechende addChangeListener und removeChangeListener- Methoden müsstest du dann natürlich auch implementieren. Wenn sich dann der Timestamp der Datei ändert iterierst du über die Liste und rufst von jedem Changelistener die stateChanged-methode mit einem ChangeEvent dem du als Source das File-Objekt übergibst. Letztendlich kannst das Event dann in etwa so Abfangen: MyFileObserver fileObserver = new MyFileObserver(file); fileObserver.addChangeListener(new ChangeListener(){ @Override public void stateChanged(ChangeEvent event){ // potentiell unsicher durch fehlenden TypeCheck File f = (File)event.getSource(); // Neu laden der Datei load(f); } }); Der FileObserver könnte in etwa so aussehen: import java.io.File; import java.util.LinkedList; import java.util.List; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class FileObserver extends Thread { private File mFile; private boolean mRunning = true; private long mTimeStamp; private List<ChangeListener> mChangeListeners = new LinkedList<>(); public FileObserver(File file) { super(FileObserver.class.getCanonicalName() + ": " + file.getAbsolutePath()); this.mFile = file; this.mTimeStamp = file.lastModified(); start(); } public void addChangeListener(ChangeListener listener) { synchronized (mChangeListeners) { mChangeListeners.add(listener); } } public void removeChangeListener(ChangeListener listener) { synchronized (mChangeListeners) { mChangeListeners.add(listener); } } public void stopObserving() { mRunning = false; interrupt(); } @Override public void run() { while (mRunning) { long timeStamp = mFile.lastModified(); if (timeStamp != this.mTimeStamp) { notifyFileChanged(); mTimeStamp = timeStamp; } try { Thread.sleep(1000); } catch (InterruptedException e) {} } } private void notifyFileChanged() { ChangeEvent changeEvent = new ChangeEvent(mFile); synchronized (mChangeListeners) { for (ChangeListener changeListener : mChangeListeners) { try { changeListener.stateChanged(changeEvent); } catch (Throwable e) { e.printStackTrace(); } } } } } Hinweis: Der Thread im beispiel läuft solang weiter bis du durch aufrufen der Methode stopObserving() den Spaß beendest. Tust du das nicht verschwendest du ressourcen. Du kannst es auch so machen, dass die Schleife unterbrochen wird, sobald sich die Datei geändert hat. Aber so hätte es den Vorteil, dass der Benutzer mit Nodepad++ auch 1000x speichern kann und du lädst immer automatisch neu.
-
Wenn du weißt wie die Datei heißt könntest du über myFile.lastModified das Datum der letzten Änderung abfragen. Lass doch einen Thread laufen der regelmäßig prüft, ob die Datei geändert wurde und ggf. diese neu einließt. Andere Möglichkeit: Runtime.getRuntime().exe(...) liefert dir ein Process-Objekt zurück. Von diesem könntest du dir den InputStream holen und versuchen zu lesen (da kommt wahrscheinlich nichts drüber rein, ist aber auch egal), denn sobald Notepad++ wieder geschlossen wird solltest du eine IOException bekommen oder anderweitig einen Fehler. Sobald der auftritt weißt du dann: Ok... Notepad++ geschlossen => datei neu laden.