Text-Info in der Taskbar anzeigen

Diskutiere Text-Info in der Taskbar anzeigen im AWT, Swing, JavaFX & SWT Bereich.
S

sirbender

Hi,

ich will lediglich einen Text in der Taskbar anzeigen. Zum Beispiel die CPU Temperatur:

"CPU Core1-4: ~71 C"

Ich will das nicht in einem Popup oder sonstwie anzeigen, sondern einfach dauerhaft in der Taskbar für jedes OS. Ein Popup zusätzlich wäre hübsch wenn z.B. die Temp. länger als 30sec. über 90 C ist oder so.

Den Code habe ich fertig nur mit dieser Taskbar-Visualisierung tue ich mir schwer.
 
T

Tobias-nrw

Zeige mal den Code, mit dem du die Temperatur abfragen kannst.
 
S

sirbender

Hmm? Wie ist das wichtig? Ich habe eine Funktion:

updateText(String text)

Rufe ich die Funktion auf, soll der Text in der Taskbar angezeigt werden. Inwiefern ist der Temperatur-Abfragecode wichtig?
 
J

JustNobody

Zeige mal den Code, mit dem du die Temperatur abfragen kannst.
Das ist der triviale Punkt in meinen Augen. Da bietet sich die oshi Library geradezu an:
implementation 'com.github.oshi:eek:shi-core:4.4.0'

Und dann ein einfaches:
new SystemInfo().getHardware().getSensors().getCpuTemperature();
liefert einen double Wert mit der CPU Temperatur.

Aber die Frage mit der Taskbar ist so universell aus meiner Sicht nicht machbar. Je nach Betriebssystem / GUI ist auch immer die Frage, was für Leisten es überhaupt gibt und wie diese konfiguriert wurden.

Was mit hier einfallen würde als Workaround: Man könnte z.B. ein JFrame bauen, bei dem man setzten könnte:

a) Kein Rahmen und keine Titelleiste:
frame.setUndecorated(true);
Achtung: Das muss gesetzt werden, ehe das Fenster sichtbar gemacht wird.

b) Always on Top:
frame.setAlwaysOnTop(true);

c) Opacity:
frame.setOpacity(0.5f);

d) Darf keinen Focus kriegen:
frame.setFocusable(false);

e) Nicht in der Taskbar anzeigen:
frame.setType(Window.Type.UTILITY);
Achtung: Muss wie das setUndecorated vor dem setVisible gemacht werden!

Das kann dann der User an einen Platz schieben, den er für geeignet hält. Man könnte aber auch erst einmal ein default Platz vorgeben, z.B, ganz oben und mit etwas Abstand an den rechten Rand, so dass die Bedienung der Fenster noch möglich ist.

Ansonsten: Wenn der User eine Taskleiste hat, dann zeigt er ggf. auch die Titel an - also kann man das auch darüber machen. Also einfach ein Fenster, dem man den entsprechenden Titel gibt.
- Funktioniert aber nur, wenn Anwender das auch anzeigen (Ich sehe das z.B. nicht)
- Ggf wird das gefiltert. Gerade unter den diversen Linux Oberflächen ist da einiges möglich.
- Die Taskbar gibt es teilweise nicht. Ubuntu hat oben zwar eine Leiste aber eine Applikation kommt nur mit Icon in die Leiste am linken Rand.

Das wären so meine Ideen.
 
J

JustNobody

Weil das in Java ohne Fremd Libs nicht geht und ich mir keinen Blödsinn erzählen lassen will.

Ein Taskbar Icon ist natürlich trivial.
Hier verstehe ich Deine Reaktion nicht. Erst einmal kann man ihm glauben, dass er den Code hat. Ist ja auch egal. Er will einen Text anzeigen. Woher der Text kommt ist erst einmal tatsächlich egal. Und da es Dich zu interessieren schien: Ich habe für Dich ja auch einmal aufgezeigt, wie einfach die Information zu kriegen ist. Und er hat nie behauptet, dass er es ohne irgendwelche Libraries gemacht hat.

Und das Problem vom TE ist nicht ein Taskbar icon. Und selbst wenn: Wenn es trivial ist, dann zeige es doch eben auf, wie es geht.
 
S

sirbender

@JustNobody vielen Dank. Das mit dem JFrame ohne Decoration hatte ich mir mittlerweile selbst ueberlegt. Aber viele deiner anderen Einstellungen sind noch sehr viel nuetzlicher!

frame.setOpacity(0.5f); klappt leider nicht bei Linux.

frame.setType(Window.Type.UTILITY); funzt scheinbar auch nicht. In meiner Taskliste wird es immer noch angezeigt. Nutze ich es falsch?
 
J

JustNobody

Hast Du das das frame.setType(Window.Type.UTILITY); gemacht, ehe Du das frame angezeigt hast? Das muss vor dem ersten Anzeigen gemacht werden.

Und unter Windows funktioniert es. Ob das bei Linux bei allen möglichen Distributionen funktioniert kann ich nicht sagen. Da habe ich es bisher nicht getestet.
 
S

sirbender

Ja. Liegt wohl an Linux. Kein Problem. Danke fuer die Hilfe.

Ich hab jetzt auch das komplette JFrame/ContentPane/JLabel transparent gemacht. Leider wird dadurch auch der vorherige Text im JLabel nicht entfernt und der neue Text einfach druebergerendert. Alle meine Versuche mit clearRect, invalidate, validate, repaint, usw. sind bisher gescheitert.
 
J

JustNobody

Ja. Liegt wohl an Linux. Kein Problem. Danke fuer die Hilfe.

Ich hab jetzt auch das komplette JFrame/ContentPane/JLabel transparent gemacht. Leider wird dadurch auch der vorherige Text im JLabel nicht entfernt und der neue Text einfach druebergerendert. Alle meine Versuche mit clearRect, invalidate, validate, repaint, usw. sind bisher gescheitert.
Das wundert mich etwas. Kannst Du da mal den Code zeigen? Oder kleines, minimales Beispiel erstellen und teilen?
 
S

sirbender

Eigentlich bin ich zufrieden mit dem Ergebnis. Das Painting-Problem löse ich indem ich die JLabel auf setOpaque(true) setze. Transparent wäre mir lieber aber schlimm ist es nicht. Anbei mal ein Beispiel mit dem Painting-Problem.

Oben Links im Bildschirm erscheint das CPU-Temp Info Fenster. Ich nutze AWTUtilities - vielleicht erlaubt das deine IDE nicht in Java8...also musst du mal schauen wie du das behebst wenn er meckert.

Java:
import java.awt.Color;
import java.awt.FlowLayout;
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.DecimalFormat;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import com.sun.awt.AWTUtilities;

public class Example {

    static final ScheduledThreadPoolExecutor exe = new ScheduledThreadPoolExecutor(1);

    public static void main(String[] args) throws MalformedURLException, IOException {
        JFrame frame = new JFrame(Example.class.getName());
        int gap = 12;
        JPanel contentPane = new JPanel(new FlowLayout(FlowLayout.RIGHT, gap, 5));
        contentPane.setBackground(Color.white);
        frame.setContentPane(contentPane);
        schedule(contentPane);
        schedule(contentPane);

        frame.setAlwaysOnTop(true);
        frame.setType(JFrame.Type.POPUP);
        frame.setUndecorated(true);

        AWTUtilities.setWindowOpaque(frame, false);

        frame.pack();
        frame.setVisible(true);

//        TrayUtils.initTray(frame, () -> System.exit(0));
    }

    static DecimalFormat df = new DecimalFormat("#.00");

    static void schedule(JPanel contentPane) {
        JLabel label = new JLabel();
//        label.setOpaque(true);
        Runnable command = () -> {
            String text = df.format(getCPUTemp());
            label.setText(text);
        };
        command.run();
        int refresh = 5;
        exe.scheduleAtFixedRate(command, refresh, refresh, TimeUnit.SECONDS);
        contentPane.add(label);
    }

    private static Number getCPUTemp() {
        return Math.random() * 100;
    }

}
 
J

JustNobody

Also die AWT Toolbox ist asbach und du alles vor jdk 8 ist für mich unverständlich muss ich gestehen :)

https://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html könntest Du einmal durchgehen. Da hast du
a) Die genaue Prüfung, was die Umgebung überhaupt kann:

Code:
import static java.awt.GraphicsDevice.WindowTranslucency.*;

// Determine what the default GraphicsDevice can support.
GraphicsEnvironment ge =
    GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();

boolean isUniformTranslucencySupported =
    gd.isWindowTranslucencySupported(TRANSLUCENT);
boolean isPerPixelTranslucencySupported =
    gd.isWindowTranslucencySupported(PERPIXEL_TRANSLUCENT);
boolean isShapedWindowSupported =
    gd.isWindowTranslucencySupported(PERPIXEL_TRANSPARENT);
b) Für jede der drei Varianten Codebeispiele, wie das aussehen würde.

Du kannst also einfach einmal schauen, was Deine Linux Kiste überhaupt unterstützt. Windows unterstützt alles drei und da reicht es einfach aus, das zu setzen wie von mir weiter oben gezeigt. Funktioniert auch bei deinem Code - den AWTToolbox Aufruf ersetzt durch frame.setOpacity(0.55f); und schon ist das durchscheinend....
 
S

sirbender

isUniformTranslucencySupported: false
isPerPixelTranslucencySupported: true
isShapedWindowSupported: true


Wie erwähnt geht das bei mir nicht: frame.setOpacity(0.55f);


Exception in thread "main" java.lang.UnsupportedOperationException: TRANSLUCENT translucency is not supported.
at java.awt.Window.setOpacity(Window.java:3627)
at java.awt.Frame.setOpacity(Frame.java:962)
 
J

JustNobody

Hast Du den Link einmal weiter angesehen? Das setOpacity ist ja das uniform translucency und das ist tatsächlich nicht unterstützt laut der Ausgabe.

Daher solltest Du einmal den Abschnitt "How to Implement Per-Pixel Translucency" des Links ansehen. Das sollte dann ja funktionieren.
 
Blender3D

Blender3D

Ja. Liegt wohl an Linux. Kein Problem. Danke fuer die Hilfe.
Ich habe einen wissenschaftliche Taschenrechner für Linux und Windows programmiert. Ich verwende da ein Icon in der Titelleiste. Unter Ubuntu hatte ich das Problem, dass das Icon nicht angezeigt wurde. Mein Workaround war hier folgender.
Java:
Properties prop = System.getProperties();
        boolean isLinux = prop.getProperty("os.name").toUpperCase().equals("LINUX") ? true : false;
        if (isLinux)
            JFrame.setDefaultLookAndFeelDecorated(true);
Vielleicht ist Dein Problem ähnlich geartet.
PS. Falls jemand eine bessere Lösung kennt, dann bitte hier posten.
 
Thema: 

Text-Info in der Taskbar anzeigen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben