Die die aktuelle Größe zusätzlich in einem Label angezeigt wird

VansCat

Mitglied
Hallo und Guten Tag!
ich bin ein absoluter Anfänger Student in Java :rtfm:, und ich habe ein Projekt über GUI JLabel machen muss. Mein Deutsch ist nicht so gut, so dass schwer für mich manchmal zu verstehen ist und meinen Lehrer hilft mir nicht.
Ich habe schon die Komponenten in einem LayoutGrid gemacht aber ich versehe nicht was ich beim Label machen soll und wie. Ich bedanke mich sehr für Hilfe 🙂
Meine Einsendeaufgabe ist:
Erweitern Sie die Anwendung aus diesem Studienheft, in der die Größe eines Textes über die beiden Schaltflächen verändert werden kann, so, dass die aktuelle Größe zusätzlich in einem Label angezeigt wird.
Ordnen Sie die Komponenten bitte außerdem in einem GridLayout mit zwei Spalten an. Welche Komponente wo erscheint, ist dabei Ihnen überlassen.
Bitte beachten Sie, dass Sie den Wert eines int-Typen nicht direkt in einem Label anzeigen lassen können. Sie müssen den Wert erst in den Typen String umwandeln – zum Beispiel mit Integer.toString(<intWert>).
Meinen Quelltext:
Java:
import java.awt.GridLayout;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;


public class TextSpielereiGUI extends JFrame{
	
	//die ID wurde automatisch mit Eclipse ergänzt
	private static final long serialVersionUID = 9101793356610287754L;

	//ein Label und zwei Schaltflächen als Instanzvariablen
	private JLabel ausgabe;
	private JButton schaltflaecheGroesser, schaltflaecheKleiner;
	//The actual size to be displayed as Label 
	private int schriftGroesse;
	
	
	
	//eine innere Klasse für den WindowListener und den ActionListener
	//die Klasse ist von WindowAdapter abgeleitet und
	//implementiert die Schnittstelle ActionListener
	class MeinKompakterListener extends WindowAdapter implements ActionListener{
		//für das Öffnen des Fensters
		@Override
		public void windowOpened(WindowEvent e) {
			//für die Eingabe
			String eingabe;
			eingabe = JOptionPane.showInputDialog("Geben Sie einen Text ein");
			//den Text in das Label setzen
			ausgabe.setText(eingabe);
			//das Fenster neu "packen"
			pack();
		}

		//für die Schaltflächen
		@Override
		public void actionPerformed(ActionEvent e) {
			//wurde auf Größer geklickt
			if (e.getActionCommand().equals("+")) 
				//die Schriftgröße um 1 erhöhen
				schriftGroesse++;
			//wurde auf Kleiner geklickt
			if (e.getActionCommand().equals("-")) 
				//die Schriftgröße um 1 verringern
				schriftGroesse--;
			//und neu setzen
			ausgabe.setFont(new Font("Arial", Font.PLAIN, schriftGroesse));
			//das Fenster neu "packen"
			pack();
		}
	}

	//der Konstruktor
	//er erzeugt die Komponenten und setzt die Fenstereinstellungen
	public TextSpielereiGUI(String titel) {
		//den Konstruktor der Basisklasse aufrufen und den Fenstertitel übergeben
		super(titel);
		//die beiden Schaltflächen
		schaltflaecheGroesser = new JButton("+");
		schaltflaecheKleiner = new JButton("-");
		//ein leeres Label
		ausgabe = new JLabel();
		
		//die Größe für die Schrift setzen
		schriftGroesse = 20;
		//die Schriftart im Label setzen
		ausgabe.setFont(new Font("Tahoma",Font.PLAIN, schriftGroesse));
		//Change from FlowLaout to GridLayout 
		setLayout(new GridLayout (0,2,5,5));
		add(schaltflaecheGroesser);
		add(schaltflaecheKleiner);
		add(ausgabe);
		setSize (250,250);
		setLocationByPlatform(true);
		
		
		//den Listener verbinden
		MeinKompakterListener listener = new MeinKompakterListener();
		addWindowListener(listener);
		schaltflaecheGroesser.addActionListener(listener);
		schaltflaecheKleiner.addActionListener(listener);
		
		//das Fenster packen
		
		//die Standardaktion beim Schließen festlegen
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//das Fenster anzeigen
		setVisible(true);
	}
	public static void main(String[] args) {
		new TextSpielereiGUI("Einsendeaufgabe 1");
	}

}
 
Du musst erstmal ein neues Label zum Frame hinzufügen. Unten rechts hast du ja noch Platz. In diesem Label soll die Fontsize angezeigt werden, die beim Label "ausgabe" gesetzt wurde. Das Update des neuen Labels kannst du in der actionPerformed Methode machen.
 
Hallo Zusammen,

ich krame mal diesen Uraltbeitrag aus...der letzte Hinweis zum war eine weiteres Label zu erzeugen und das Update in der actionPerformed Methode durchzuführen. Daher habe ich zunächst ein weiteres Label (ausgabe2) definiert...

[CODE lang="java" title="zusätzliche Label ausgabe2" highlight="7"]public class TestGUI extends JFrame{

//die ID wurde automatisch mit Eclipse ergänzt
private static final long serialVersionUID = 9101793356610287754L;

//zwei Label und zwei Schaltflächen als Instanzvariablen
private JLabel ausgabe, ausgabe2;
private JButton schaltflaecheGroesser, schaltflaecheKleiner;
//The actual size to be displayed as Label
private int schriftGroesse;[/CODE]

des weiteren im Konstruktor die ausgabe2 erzeugt. Hierbei die Methode Integer.toString genutzt, da ja ein Integer Wert in einem JLabel angezeigt werden soll.

[CODE lang="java" title="zusätzliche Label ausgabe2"]//der Konstruktor
//er erzeugt die Komponenten und setzt die Fenstereinstellungen
public TestGUI(String titel) {
//den Konstruktor der Basisklasse aufrufen und den Fenstertitel übergeben
super(titel);
//die beiden Schaltflächen
schaltflaecheGroesser = new JButton("+");
schaltflaecheKleiner = new JButton("-");
//ein leeres Label
ausgabe = new JLabel();



//die Größe für die Schrift setzen
schriftGroesse = 20;
//die Schriftart im Label setzen
ausgabe.setFont(new Font("Tahoma",Font.PLAIN, schriftGroesse));
ausgabe2 = new JLabel(Integer.toString(schriftGroesse));
//Change from FlowLaout to GridLayout
setLayout(new GridLayout (0,2,5,20));
add(schaltflaecheGroesser);
add(schaltflaecheKleiner);
add(ausgabe);
add(ausgabe2);[/CODE]

Im zweiten Label wird nun auch der Initialwert der schriftGroesse angezeigt (in diesem Fall 20). Woran ich aber scheitere ist die Aktualisierung über die actionPerformed Methode... die sieht im Moment so aus:

[CODE lang="java" title="action performed"]@Override
public void actionPerformed(ActionEvent e) {
//wurde auf Größer geklickt
if (e.getActionCommand().equals("+"))
//die Schriftgröße um 1 erhöhen
schriftGroesse++;
ausgabe2 = new JLabel(Integer.toString(schriftGroesse));
//wurde auf Kleiner geklickt
if (e.getActionCommand().equals("-"))
//die Schriftgröße um 1 verringern
schriftGroesse--;
ausgabe2 = new JLabel(Integer.toString(schriftGroesse));
//und neu setzen
ausgabe.setFont(new Font("Arial", Font.PLAIN, schriftGroesse));

//das Fenster neu "packen"
pack();
}
}[/CODE]

persönlich vermute ich dass hier nicht mit new gearbeitet werden sollte (da ich ja kein neues Label anlegen möchte) aber wenn ich es weglasse beschwert sich der Compiler, dass "Die Methode JLabel(String) ist für den Typ TestGUI.MeinKompakterListener nicht definiert (undefined)"

würde mich ebenfalls als blutigen Anfänger bezeichnen, daher bin ich über jeden Hinweis dankbar. Vielen Dank und VG
 
habs selbst rausbekommen freu 🙂 wenn ich statt des neu setzen des Labesls...mit setText arbeite klappt es...

[CODE lang="java" title="Ausgabe der Schriftgröße im Label"]ausgabe2.setText(Integer.toString(schriftGroesse));[/CODE]
 
Hallo,

ich hab das ganze umgesetzt, bekomme aber jetzt eine Fehlermeldung :

Exception in thread "main" java.lang.NullPointerException
at de.fernschulen.j09d_06.TextSpielereiGUI.<init>(TextSpielereiGUI.java:76)
at de.fernschulen.j09d_06.TextSpielereiProgramm.main(TextSpielereiProgramm.java:5)

Also Fehler in Zeile 76:
ausgabe.setFont(new Font("Arial",Font.PLAIN, schriftGroesse));

Durch was wird dieser Fehler ausgelöst, habe hier ja nichts geändert?

HIer der komplette Code:
Java:
package de.fernschulen.j09d_06;

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;


public class TextSpielereiGUI extends JFrame{
    
    //die ID wurde automatisch mit Eclipse ergänzt
    private static final long serialVersionUID = 9101793356610287754L;

    //ein Label und zwei Schaltflächen als Instanzvariablen
    private JLabel ausgabe, ausgabe2;
    private JButton schaltflaecheGroesser, schaltflaecheKleiner;
    
    //für die aktuelle Schriftgröße
    private int schriftGroesse;
    //eine innere Klasse für den WindowListener und den ActionListener
    //die Klasse ist von WindowAdapter abgeleitet und
    //implementiert die Schnittstelle ActionListener
    class MeinKompakterListener extends WindowAdapter implements ActionListener{
        //für das Öffnen des Fensters
        @Override
        public void windowOpened(WindowEvent e) {
            //für die Eingabe
            String eingabe;
            eingabe = JOptionPane.showInputDialog("Geben Sie einen Text ein");
            //den Text in das Label setzen
            ausgabe.setText(eingabe);
            //das Fenster neu "packen"
            pack();
        }

        //für die Schaltflächen
        @Override
        public void actionPerformed(ActionEvent e) {
            //wurde auf Größer geklickt
            if (e.getActionCommand().equals(">"))
                //die Schriftgröße um 1 erhöhen
                schriftGroesse++;
                ausgabe2.setText(Integer.toString(schriftGroesse));
            //wurde auf Kleiner geklickt
            if (e.getActionCommand().equals("<"))
                //die Schriftgröße um 1 verringern
                schriftGroesse--;
                ausgabe2.setText(Integer.toString(schriftGroesse));
            //und neu setzen
            //ausgabe.setFont(new Font("Arial", Font.PLAIN, schriftGroesse));
            //das Fenster neu "packen"
            pack();
        }

    }

    //der Konstruktor
    //er erzeugt die Komponenten und setzt die Fenstereinstellungen
    public TextSpielereiGUI(String titel) {
        //den Konstruktor der Basisklasse aufrufen und den Fenstertitel übergeben
        super(titel);
        //die beiden Schaltflächen
        schaltflaecheGroesser = new JButton(">");
        schaltflaecheKleiner = new JButton("<");
        
        //die Größe für die Schrift setzen
        schriftGroesse = 10;
        //die Schriftart im Label setzen
        ausgabe.setFont(new Font("Arial",Font.PLAIN, schriftGroesse));
        ausgabe2 = new JLabel(Integer.toString(schriftGroesse));
        //ein Layout anwenden
        setLayout(new FlowLayout());
        //die Komponenten hinzufügen
        add(schaltflaecheGroesser);
        add(schaltflaecheKleiner);
        add(ausgabe);
                
        //den Listener verbinden
        MeinKompakterListener listener = new MeinKompakterListener();
        addWindowListener(listener);
        schaltflaecheGroesser.addActionListener(listener);
        schaltflaecheKleiner.addActionListener(listener);
        
        //das Fenster packen
        pack();
        //die Standardaktion beim Schließen festlegen
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //das Fenster anzeigen
        setVisible(true);
        
    }
}
 
Vermutlich ist die Instanzvariable "ausgabe" noch nicht initialisiert (und damit null). Du versuchst, die Methode setFont() auf eine nicht existierende Instanz von JLabel aufzurufen.
 
Danke, das Problem habe ich gelöst.

Jetzt hab ich das Problem, dass er mir zwar die aktuelle Schriftgröße im Fenster neben dem eingegeben Text anzeigt.
Allerdings soll die aktuelle Schriftgröße als ToolTipText auf dem jeweiligen Button erscheinen (schaltflaecheGroesser, schaltflaecheKleiner)?

Wie bekomme ich das hin?

Danke für die Hilfe!
 
Jetzt hab ich das Problem, dass er mir zwar die aktuelle Schriftgröße im Fenster neben dem eingegeben Text anzeigt.
Allerdings soll die aktuelle Schriftgröße als ToolTipText auf dem jeweiligen Button erscheinen (schaltflaecheGroesser, schaltflaecheKleiner)?

Wie bekomme ich das hin?
Indem du den ToolTipText entsprechend setzt?

Die Dokumentation ist dein Freund: https://docs.oracle.com/javase/7/docs/api/javax/swing/JButton.html

Da JButton u. a. von JComponent erbt, auch : https://docs.oracle.com/javase/7/do...mponent.html#setToolTipText(java.lang.String)
 
So jetzt muss ich es nur noch hinbekommen, dass die aktuelle Schriftgröße aus der Instanzvariablen ausgabe2 in den ToolTipText eingebunden wird. Kann mir da jemand nen Tip geben? Vielen Dank im Voraus!

Der aktuelle Konstruktor sieht so aus:

Java:
//der Konstruktor
    //er erzeugt die Komponenten und setzt die Fenstereinstellungen
    public TextSpielereiGUI(String titel) {
        //den Konstruktor der Basisklasse aufrufen und den Fenstertitel übergeben
        super(titel);
        //die beiden Schaltflächen
        schaltflaecheGroesser = new JButton("<");
       [B] schaltflaecheGroesser.setToolTipText("ausgabe2");[/B]
        schaltflaecheKleiner = new JButton(">");
        [B]schaltflaecheKleiner.setToolTipText("ausgabe2");[/B]
        //ein leeres Label
        ausgabe = new JLabel();
        
        //die Größe für die Schrift setzen
        schriftGroesse = 10;
        //die Schriftart im Label setzen
        ausgabe.setFont(new Font("Arial",Font.PLAIN, schriftGroesse));
        ausgabe2 = new JLabel(Integer.toString(schriftGroesse));
        //Wechsel vom FlowLayout zum GridLayout
        setLayout(new GridLayout (0,2,10,20));
        //die Komponenten hinzufügen
        add(schaltflaecheGroesser);
        add(schaltflaecheKleiner);
        add(ausgabe);
        add(ausgabe2);
 
Jetzt hab ich das Problem, dass er mir zwar die aktuelle Schriftgröße im Fenster neben dem eingegeben Text anzeigt.
Allerdings soll die aktuelle Schriftgröße als ToolTipText auf dem jeweiligen Button erscheinen (schaltflaecheGroesser, schaltflaecheKleiner)?
Ich habe den Code für dich etwas lesbarer gestaltet.
[CODE lang="java" highlight="62-63"]import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.border.Border;

public class TextSpielereiGUI extends JFrame {
private static final long serialVersionUID = 9101793356610287754L;

private JLabel labelText = new JLabel();
private JLabel labelFontSize = new JLabel();
private JButton buttonBigger = new JButton(">");
private JButton buttonSmaller = new JButton("<");;
private int fontSize = 10;// aktuelle Schriftgroesse

// eine innere Klasse fuer den WindowListener
// die Klasse ist von WindowAdapter abgeleitet,
// und implementiert die Schnittstelle ActionListener
class MeinKompakterListener extends WindowAdapter implements ActionListener {
private int maxFontSize = 200;
private int minFontSize = 5;

// fuer das Oeffnen des Fensters
@Override
public void windowOpened(WindowEvent e) {
// fuer die Eingabe
String eingabe = JOptionPane.showInputDialog("Geben Sie einen Text ein", "Test");
// den Text in das Label setzen
labelText.setText(" " + eingabe + " ");
updateSize();
// das Fenster neu "packen"
pack();
}

// fuer die Schaltflaechen
@Override
public void actionPerformed(ActionEvent e) {
// wurde auf Groesser geklickt
if (e.getActionCommand().equals(">") && fontSize < maxFontSize)
fontSize++;// Schriftgroesse um 1 erhoehen
// wurde auf Kleiner geklickt
if (e.getActionCommand().equals("<") && fontSize > minFontSize)
fontSize--;// die Schriftgroesse um 1 verringern
updateSize();
}

public String getFontSizeStr(int fontSize) {
return " " + fontSize + " ";
}

public void updateSize() { // anzeigen erneuern
labelText.setFont(labelText.getFont().deriveFont((float) fontSize));
labelFontSize.setText(getFontSizeStr(fontSize));
buttonBigger.setToolTipText(getFontSizeStr(fontSize));
buttonSmaller.setToolTipText(getFontSizeStr(fontSize));
pack();// Fenster neu "packen"
}

}

// der Konstruktor er erzeugt die Komponenten
// und setzt die Fenstereinstellungen
public TextSpielereiGUI(String titel) {
super(titel);// Konstruktor der Basisklasse mit Fenstertitel aufrufen

// die Schriftart im Label setzen
labelText.setFont(new Font("Arial", Font.PLAIN, fontSize));
labelFontSize = new JLabel(" " + fontSize);
setLayout(new FlowLayout());// Layout anwenden
// Komponenten hinzufügen
add(buttonBigger);
add(buttonSmaller);
add(labelText);
add(labelFontSize);
// Label mit schwarzen Rahmen versehen
Border border = BorderFactory.createLineBorder(Color.BLACK);
labelFontSize.setBorder(border);
labelText.setBorder(border);

// den Listener verbinden
MeinKompakterListener listener = new MeinKompakterListener();
addWindowListener(listener);
buttonBigger.addActionListener(listener);
buttonSmaller.addActionListener(listener);

pack();// Fenster packen
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// Fenster beim Beenden schiessen
setVisible(true);// Fenster anzeigen
}
}[/CODE]
 
Ich halte es ja für fragwürdig, eine fertige Lösung zu liefern, wenn es offenbar Verständnisprobleme mit dem vorhandenen Code gibt. Darum noch eine kleine Erklärung, was zu tun ist.

Du möchtest, dass sobald die Schriftgröße geändert wird, ein anderer Text im Label und im ToolTip angezeigt wird. Du musst also, wenn du die Schriftgröße änderst auch die beiden anderen Inhalte entsprechend ändern. Das geschieht sinnvollerweise im Listener, der auf die beiden Button-Klicks reagiert.
 
Vielen Dank für die spitzen Hilfe. Ich wollte ja gar nicht den kompletten Code, sondern nur
Hinweise, damit ich es selbst versuchen kann. Aber ich konnte mir das jetzt genau anschauen
und hab das dadurch auch verstanden.
 

Zurück
Oben