Datenübergabe über Buttons

kodela

Bekanntes Mitglied
Hallo,

In meinem Stradoku Programm habe ich zwei Ziffernblöcke mit je neun Buttons, über die Werte zugewiesen werden können. Das funktioniert unter Windows seit Jahren einwandfrei. Jetzt habe ich festgestellt, dass unter Linux von den Buttons nur die Beschriftung (1 bis 9), aber der Button selbst nicht angezeigt wird.

Ich kam daher auf den Gedanken, über jeden Button ein Icon mit der jeweiligen Ziffer zu legen. Das wird unter Linux dann auch angezeigt, aber jetzt wird kein Wert mehr übergeben.

Hier der wesentliche Auszug aus der Bearbeitungsmethode für die Übernahme eines Wertes, wenn der Anwender einen der Buttons aus dem Kandidatenblock anklickt.

Java:
    private void kandidat_ActionPerformed(java.awt.event.ActionEvent evt) {                                       

        int knd = Integer.parseInt(((JButton) evt.getSource()).getText());
          ...
          ...
    }

In der ersten Zeile dieser Methode wird der für actionCommand jeweils festgelegte Wert als String abgefragt und nach Integer geparst.

Ist den Buttons aber ein Icon überlegt, wird ein leerer String zurückgegeben. Hier das Fehlerprotokoll:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:592)
at java.lang.Integer.parseInt(Integer.java:615)
at stradoku.StradokuApp.kandidat_ActionPerformed(StradokuApp.java:3976)

Kann mir jemand sagen, warum bei den Buttons mit Icon der für actionCommand jeweils festgelegte Wert nicht übergeben wird?

kodela

PS: Problem ist gelöst:

getText() durch getActionCommand() ersetzen!
 
Zuletzt bearbeitet:
Jetzt habe ich festgestellt, dass unter Linux von den Buttons nur die Beschriftung (1 bis 9), aber der Button selbst nicht angezeigt wird.
Mh, ich brauche eine Wiederholung zum Thema LaF.

Also Swing unterstuetzt Themes, in Java Terminologie nennt sich das 'Look and Feel'. Kurzum, welches LaF verwendet wird, ist von der Platform abhaengig, aber du kannst es in deiner Applikation (oder der Benutzer per JVM-Parameter) ueberschreiben.

Ich rate mal dass unter Linux ein LaF verwendet wurde welches eben keine Rahmen fuer die `JButton`s zeichnet, oder, was ich mir auch gut vorstellen kann, dass das GTK-LaF eingestellt war. GTK ist leider sehr, sehr schwierig geworden wenn es um Interoperatibilitaet geht, und es wuerde mich nicht wundern wenn die die Kompatibilitaet zum GTK-LaF von Swing zerbrochen haben und es daher einfach nicht mehr richtig funktionieren kann.
 
Danke für die Antwort.

Ja, das Problem hängt sicher mit LaF zusammen. Ich muss da aber jetzt etwas weiter ausholen. Meine ursprüngliche Aussage, unter Linux würde von den Buttons nur die Beschriftung (1 bis 9), aber der Button selbst nicht angezeigt, ist nicht korrekt. Genauer gesagt, ich erhielt von einem Anwender des Programms die Frage, ob es auch unter Linux lauffähig sei. Da ich selbst Linux nicht verwende, konnte ich die Frage auch nicht verbindlich beantworten. Grundsätzlich müsste das Programm ja auch unter Linux lauffähig sein. Da ich aber LaF für Windows in der main-Methode eingebunden habe entfernte ich es einmal und nun bekam ich den geschilderten Zustand, dass die Buttons nicht mehr als solche, sondern nur die Beschriftung mit den Ziffern angezeigt wurden. Meine main-Methode sieht so aus:

Java:
    public static void main(final String args[]) {
        try {
            UIManager.setLookAndFeel(
                    UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException
                | InstantiationException
                | IllegalAccessException
                | UnsupportedLookAndFeelException ex) {
            JOptionPane.showMessageDialog(null,
                    "Es ist ein Fehler aufgetreten. \n\n"
                    + ex.getMessage(),
                    "Hinweis", 1);
        }
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new StradokuApp(args).setVisible(true);
            }
        });
    }

Entfernte ich daraus den try-Block, kam es zu dem geschilderten Verhalten mit den Ziffernblöcken. In Unkenntnis der genauen Auswirkungen von der LaF-Einbindung. Wie ich aber bereits geschrieben habe, konnte ich durch eine Änderung der ActionPerformed-Methoden das Problem umgehen, indem ich nicht mit getText() die Beschriftung sondern statt dessen actionCommand abfragte.

Wie sich dies alles aber unter Linux verhält, weiß ich leider nicht. Unter Windows habe ich allerdings ein zweites Problem bei fehlender LaF-Einbindung entdeckt. In der Stradoku-Liste werden die Felder der Kopfzeile nicht angezeigt, alle Felder sind schwarz. Hier rätsle ich noch immer, woran das liegt. Alle anderen Funktionalitäten laufen auch ohne LaF-Einbindung problemlos. Also lasse ich die LaF-Einbindung und riskiere, dass sie sich unter Linux aber negativ auswirkt.
 
Du kannst das einfach steuern:
Java:
String os = System.getProperty("os.name");
wenn os das Wort 'Windows' enthällt dann mache das ansonsten mache was anderes.

Du kannst dir auch mal das ansehen: https://github.com/JFormDesigner/FlatLaf
Das funktioniert für mich sehr gut.
 
Zuletzt bearbeitet:
Da ich aber LaF für Windows in der main-Methode eingebunden habe entfernte ich es einmal und nun bekam ich den geschilderten Zustand, dass die Buttons nicht mehr als solche, sondern nur die Beschriftung mit den Ziffern angezeigt wurden.
Das entspricht aber nicht deinem Code, in deinem Code nimmst du das System-LaF, dies entspricht auch immer dem aktuellen System. Also unter Microsoft Windows bekommst das Windows-LaF, unter Linux ein enstprechendes LaF (entweder GTK oder Metal).

Wenn du es nicht angibst, gibt es eben das Standard-LaF, da bin ich ehrlich gesagt nicht so firm was genau selektiert wird in dem Fall. Also der Code so wie du ihn hast sollte auf allen Platformen funktionieren, es sei den sie haben kein Standard-LaF, in welchem Fall er eben Fehler werfen, aber die Applikation nicht stoppen wird.
 
Danke für Eure Antworten.

Da muss ich noch einiges, LaF betreffend, verdauen. Das Problem mit der Anzeige der Buttons hat sich erledigt. Ein Ersatz für die Beschriftung der Buttons mit den Ziffern durch Icons scheidet auch aus, war ein nicht gründlich durchdachter Schnellschuss, da die Beschriftung auch für die Verwendung der Buttons als Filteranzeige dient. Bei einem Icon kann die Ziffer für einen gesetzten Filter nicht andersfarbig ausgegeben werden. Und die Frage, ob das Programm unter Linux uneingeschränkt lauffähig ist, hat sich laut einer Mitteilung des Anwenders für unbestimmte Zeit nach vorne verschoben. Also wird zunächst bei mir nichts verändert.

Unabhängig davon werde ich mich aber mit Euren Hinweisen noch beschäftigen, denn mit den LaF-Einstellungen habe ich noch eine große Wissenslücke.
 
Die Beschriftung der Buttons so zu "missbrauchen" ist nicht sinnvoll. Du kannst z.B.: das Programm auch nie in einer anderen Sprache rausbringen.
 
Die Beschriftung der Buttons so zu "missbrauchen" ist nicht sinnvoll. Du kannst z.B.: das Programm auch nie in einer anderen Sprache rausbringen.
Das mag zwar grundsätzlich so sein, in meinem Fall wird mit der "missbrauchten" Beschriftung nur die Ziffer des Buttens für die auf andere Weise der Filter gesetzt wird, farblich hervorgehoben, also lediglich eine selbsterklärende Information.
 

Zurück
Oben