Swing JLabel/JTextField Inhalt mit JSlider verändern

Alex2013

Bekanntes Mitglied
Hallo Leute, ich habe ein kleines Programm um die Komponente JSlider erweitert. Hiermit wollte ich erreichen, dass ich den Text, welcher sich in dem Label oder auch in dem Textfield befindet, in der Größe verändern kann. Also wenn ich den Regler nach rechts bewege, dann soll die Schrift größer werden und wenn ich den Regler nach links bewege, soll die Schrift kleiner werden.

Hat hier jemand einen Tipp, was ich bei dem bestehenden Code hierfür noch ändern müsste?

Code:

Java:
[code]
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Fenster extends JFrame implements ActionListener, ChangeListener
{
	private static final long serialVersionUID = 1L;
	Container c;
	JButton b1,b2,b3,b4;
	JSlider grokle;
	public Fenster()
	{
		setLayout(new FlowLayout());
		setSize(300, 300);
		add(b1=new JButton("schliessen"));
		b1.addActionListener(this);
		b1.setActionCommand("schliessen");
		add(b2=new JButton("vergroessern"));
		b2.addActionListener(this);
		b2.setActionCommand("vergroessern");
		add(b3=new JButton("verkleinern"));
		b3.addActionListener(this);
		b3.setActionCommand("verkleinern");
		add(b4=new JButton("Text anzeigen"));
		b4.addActionListener(this);
		b4.setActionCommand("Text anzeigen");
		add(grokle=new JSlider(JSlider.HORIZONTAL,0,48,2));
		grokle.setName("gross/klein");
		grokle.addChangeListener(this);
		grokle.setMajorTickSpacing(6);
		grokle.setMinorTickSpacing(2);
		grokle.setPaintTicks(true);
		grokle.setPaintLabels(true);
		grokle.setPreferredSize(new Dimension(200,50));
		setVisible(true);
	}

	public static void main(String[] args) 
	{
		new Fenster();
	}
	@Override
	public void actionPerformed(ActionEvent arg0) 
	{
		if(arg0.getActionCommand().equals("schliessen"))
		{
			setTitle("X");
			setLayout(new GridLayout(2,2));
			try
			{
				Thread.sleep(1500);
				
			}
			catch(Exception e)
			{
				JOptionPane.showMessageDialog(null,"Fehler");
			}
			dispose();
		}
		else if(arg0.getActionCommand().equals("vergroessern"))
		{
			try
			{
				Thread.sleep(100);
			}catch(Exception e)
			{
				JOptionPane.showMessageDialog(null,"Fehler");
			}
			setLayout(new FlowLayout());
			setLocation(400, 200);
			setSize(600, 600);
			setVisible(true);
		}
		else if(arg0.getActionCommand().equals("verkleinern"))
		{
			try
			{
				Thread.sleep(200);
			}catch(Exception e)
			{
				JOptionPane.showMessageDialog(null,"Fehler");
			}
			setLayout(new FlowLayout());
			setSize(200, 200);
			setVisible(true);
		}
		else if(arg0.getActionCommand().equals("Text anzeigen"))
		{
			setLayout(new FlowLayout());
			JLabel l=new JLabel();
			setSize(200, 200);
			remove(b1);
			remove(b2);
			remove(b3);
			remove(b4);
			repaint();
			l.setOpaque(true);
			l.setText("Hallo");
			add(l);
			setVisible(true);
			
		}
	}
			@Override
			public void stateChanged(ChangeEvent arg0) 
			{
				JSlider source;
				source=(JSlider)arg0.getSource();
				if(source.getName().equals("gross/klein"))
				{
					JLabel l=new JLabel();
					l.setText("Hallo");
					//so funktioniert es leider nicht
					l.resize(source.getValue(), source.getValue());
					repaint();
				}
			}
		}
[/code]

Für Tipps bin ich dankbar. 🙂

Lg
 
Also ich hab die Methode stateChanged geändert und bei mir Funktioniert es, also falls du den Sourcecode haben willst, sag es.

Du wolltest jedoch einen Tipp haben.
Also ich würde das JLabel, das "Hallo" anzeigt als globale und nicht als lokale Variable machen.
Dann kannst du in der Methode die Schriftgröße des Labels verändern und nicht die Labelgröße.

PS: füge vielleicht noch setDefaultCloseOperation(DISPOSE_ON_CLOSE); in den Code ein.
 
Zuletzt bearbeitet:
Hey, ich habe jetzt noch mal etwas verändert, so wie du es vorgeschlagen hattest. Also zunächst mal den JSlider global deklariert. Allerdings weiß ich jetzt noch nicht genau, wie ich das Problem weitergehend lösen kann. Es wäre super, wenn du mir noch mal einen Tipp geben könntest, oder sagen könntest, wie du es gemacht hast. Vlt. ist meins ja bisher gar nicht so falsch. 🙂

Hier der Code:

Java:
[code]
@Override
			public void stateChanged(ChangeEvent arg0) 
			{
				JSlider source;
				source=(JSlider)arg0.getSource();
				if(source.getName().equals("gross/klein"))
				{
					JLabel l=new JLabel();
					l.setText("Hallo");
					//so funktioniert es leider nicht
					l.setText(source.getValue());
					repaint();
				}
			}
[/code]

Lg
 
Nein, den JSlider brauchst du nicht global deklarieren, sondern den JLabel der "Hallo" anzeigt, weil du den Text darin verändern willst.

Wenn du ein globales JLabel hast, ersparst du dir das erstellen eines neuen.
Du setzt die Schrift des JLabel um: setFont(..), aber um ehrlich zu sein, ich hab einfach Google benutzt um herauszufinden, wie man die Schriftgröße eines JLabels ändert.
 
Ja gut, das könnte ich auch machen. Aber ich wollte die Schrift ja über den JSlider verändern. Indem ich diesen nach rechts und links bewege. Ich weiß jetzt nur nicht, wie ich die beiden Komponenten verbinden kann. Hast du hier noch eine weitere Idee?

PS: Ich meinte natürlich das JLabel und nicht den JSlider. Da habe ich micht vertippt ;-)

Lg
 
Nein, ich wollte nur die Schriftgröße verändern bzw. variabel halten. Wie gesagt, wenn der Regler nach rechts bewegt wird, wird die Schrift größer, wenn er nach links bewegt wird, wieder kleiner. Also nicht die Schriftart (wie z.B. Kursiv, Fett oder Arial, Times new Roman etc.)
 
Ja gut.
Also, die Schrift eines JLabels änderst du mit setFont( ... ) und den Wert des Sliders bekommst du durch getValue().

Mit etwas Google oder API findest du sicher schnell eine Lösung 🙂
 
meinst du sowas in der Art ?

Hier allerdings so simpel wie möglich gehalten ohne jegliche Fehlerbehandlung und abfragen, usw. usw...

KSKB

Java:
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class FontSizeChanger {

	private JFrame frame;
	private JPanel panel;
	
	private JLabel label;
	private JSlider slider;
	
	final Dimension frameSize = new Dimension(400,300);
	
	public FontSizeChanger() {
		initGui();
		setProperties();
		addContent();
	}
	
	private void initGui(){
		frame = new JFrame("Fonst Size Changer");
		panel = new JPanel();
		
		label = new JLabel("Diesen Text können Sie ändern.");
		slider = new JSlider();
		slider.addChangeListener(new ChangeListener(){

			@Override
			public void stateChanged(ChangeEvent e) {
				
				setFontSize(getSlider().getValue());
			}
			
		});
	}
	
	private void setProperties(){
		getFrame().setSize(frameSize);
		getFrame().setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		getFrame().setLocationRelativeTo(null);
	}
	
	private void addContent(){
	
		getPanel().add(getSlider());
		getPanel().add(getLabel());
		
		getFrame().add(panel);	
	}
	
	public void setFontSize(int value){
		Font copy = getLabel().getFont().deriveFont((float)getSlider().getValue());  // Cast auf float da du sonst den Style änderst !
		
		getLabel().setFont(copy);
	}
	
	public void setVisible(){
		getFrame().setVisible(true);
	}
	
	public JFrame getFrame() 				{return this.frame;}
	public JSlider getSlider() 				{return this.slider;}
	public JLabel getLabel() 				{return this.label;}
	public JPanel getPanel() 				{return this.panel;}
	
	public static void main(String[] args) {
		new FontSizeChanger().setVisible();
	}
}

für dich hier entscheidend ist das wenn du dir wenn du
Code:
.deriveFont(float f);
die Größe setzt du daran denken musst das dies eine Überladene Methode ist, welche auch mit einem Integer als Parameter funktioniert, dann allerdings den Style der Schrift ändert, deshalb auch der im Source Code makierte Cast auf float

Sowie das dir bewusst sein muss das diese Methode ein neues Font Objekt mit neuer Größe Liefert, hier könnte man, um ggf. blockieren des EDT dies in einen eigenen Worker Thread auslagern, um den parallelen Ablauf anderer dinge in der GUI später nicht zu behindern.
 
Zuletzt bearbeitet:
Ich habe jetzt mal in einigen Varianten versucht, das mit dem ChangeListener und mit der Methode setFontSize(), so wie du es gemacht hast umzusetzen und die Buttons etc. hinzuzufügen bzw. die Methode in der entsprechenden if Verzweigung der actionPerformed() Methode aufzurufen, aber das klappt bei mir nicht... :-(
Ich wollte ja zuerst das Fenster vergrößern und verkleinern und anschließend z.B. den Text anzeigen lassen, aber dann reagiert der ChangeListener nicht mehr. Eclipse zeigt mir hier aber auch keinen Fehler an.

Hier der Code:
Weißt du vlt. was ich da falsch mache?

Java:
[code]
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Fenster2 extends JFrame implements ActionListener 
{
	private static final long serialVersionUID = 1L;
    private JLabel label;
    private JSlider slider;
    JButton vergroessern,verkleinern,schliessen,textanzeigen;
    final Dimension frameSize = new Dimension(400,300);

    public Fenster2() 
    {
    	setLayout(new GridLayout(2,2));
    	setTitle("");
    	add(vergroessern=new JButton("vergroessern"));
    	vergroessern.addActionListener(this);
    	vergroessern.setActionCommand("vergroessern");
    	add(verkleinern=new JButton("verkleinern"));
    	verkleinern.addActionListener(this);
    	verkleinern.setActionCommand("verkleinern");
    	add(schliessen=new JButton("schliessen"));
    	schliessen.addActionListener(this);
    	schliessen.setActionCommand("schliessen");
    	add(textanzeigen=new JButton("Text anzeigen"));
    	textanzeigen.addActionListener(this);
    	textanzeigen.setActionCommand("Text anzeigen");
    	setSize(300, 200);
    	setVisible(true);
    }
   
    public void setFontSize(int value)
    {
        Font copy = getLabel().getFont().deriveFont((float)getSlider().getValue());  // Cast auf float da du sonst den Style änderst !
        setFont(copy);
    }
   
    public JSlider getSlider()              {return this.slider;}
    public JLabel getLabel()                {return this.label;}
    
   
    public static void main(String[] args) 
    {
        new Fenster2();
    }

	@Override
	public void actionPerformed(ActionEvent arg0) 
	{
		if(arg0.getActionCommand().equals("schliessen"))
			{
				setTitle("X");
				setLayout(new GridLayout(2,2));
				try
				{
					Thread.sleep(1500);
					
				}
				catch(Exception e)
				{
					JOptionPane.showMessageDialog(null,"Fehler");
				}
				dispose();
			}
			else if(arg0.getActionCommand().equals("vergroessern"))
			{
				try
				{
					Thread.sleep(100);
				}catch(Exception e)
				{
					JOptionPane.showMessageDialog(null,"Fehler");
				}
				setLayout(new FlowLayout());
				setLocation(400, 200);
				setSize(600, 600);
				setVisible(true);
			}
			else if(arg0.getActionCommand().equals("verkleinern"))
			{
				try
				{
					Thread.sleep(200);
				}catch(Exception e)
				{
					JOptionPane.showMessageDialog(null,"Fehler");
				}
				setLayout(new FlowLayout());
				setSize(200, 200);
				setVisible(true);
				pack();
			}
			else if(arg0.getActionCommand().equals("Text anzeigen"))
			{
				setLayout(new GridLayout(2,1));
				setSize(200, 200);
				remove(vergroessern);
				remove(verkleinern);
				remove(schliessen);
				remove(textanzeigen);
				repaint();
				add(slider = new JSlider());
				slider.setName("groesser/kleiner");
				slider.addChangeListener(new ChangeListener()
			    {

			         @Override
			         public void stateChanged(ChangeEvent e) 
			         {
							JSlider source;
							source=(JSlider)e.getSource();
							
							if(source.getName().equals("groesser/kleiner"))
							{
								setFontSize(getSlider().getValue());
							}
			             }
			    });
				
				add(label = new JLabel("Hallo",JLabel.CENTER));
				setVisible(true);
				setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			}
	}
    }
[/code]

Lg
 
Das hier ist falsch

Java:
 @Override
                     public void stateChanged(ChangeEvent e) 
                     {
                            JSlider source;
                            source=(JSlider)e.getSource();
                            
                            if(source.getName().equals("groesser/kleiner"))
                            {
                                setFontSize(getSlider().getValue());
                            }
                         }

ausserdem solltest du den slider final deklarieren um ihn dann in der anonymen inneren klasse zu nutzen, warte einen moment ich schau es mir grade mal an .
 
So gehts , tausch einfach den Text in deinem Listener gegen den hier unten stehenden aus

Java:
   @Override
    public void stateChanged(ChangeEvent e) 
{
     Font copy = getLabel().getFont().deriveFont((float)getSlider().getValue());
     getLabel().setFont(copy);
}

da du den Listener als innere klasse erstellst die nur für den einen speziellen Slider zuständig ist brauchst du das event nicht extra zuordnen, da es nur von diesem einen Slider kommen kann.

[EDIT]zudem kannst du oben im QuellText die von mir angelegte Methode setFontSize(int i) wieder löschen da du das dann direkt im Listener realisierst .[/EDIT]

Hier dein Kompletter funktionierender Source Code, mal abgesehen davon das er start verbesserungswürdig ist ^^

Java:
package tests;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
 
public class Fenster2 extends JFrame implements ActionListener 
{
    private static final long serialVersionUID = 1L;
    private JLabel label;
    private final JSlider slider = new JSlider();
    JButton vergroessern,verkleinern,schliessen,textanzeigen;
    final Dimension frameSize = new Dimension(400,300);
 
    public Fenster2() 
    {
        setLayout(new GridLayout(2,2));
        setTitle("");
        add(vergroessern=new JButton("vergroessern"));
        vergroessern.addActionListener(this);
        vergroessern.setActionCommand("vergroessern");
        add(verkleinern=new JButton("verkleinern"));
        verkleinern.addActionListener(this);
        verkleinern.setActionCommand("verkleinern");
        add(schliessen=new JButton("schliessen"));
        schliessen.addActionListener(this);
        schliessen.setActionCommand("schliessen");
        add(textanzeigen=new JButton("Text anzeigen"));
        textanzeigen.addActionListener(this);
        textanzeigen.setActionCommand("Text anzeigen");
        setSize(300, 200);
        setVisible(true);
    }
   
    public JSlider getSlider()              {return this.slider;}
    public JLabel getLabel()                {return this.label;}
    
   
    public static void main(String[] args) 
    {
        new Fenster2();
    }
 
    @Override
    public void actionPerformed(ActionEvent arg0) 
    {
        if(arg0.getActionCommand().equals("schliessen"))
            {
                setTitle("X");
                setLayout(new GridLayout(2,2));
                try
                {
                    Thread.sleep(1500);
                    
                }
                catch(Exception e)
                {
                    JOptionPane.showMessageDialog(null,"Fehler");
                }
                dispose();
            }
            else if(arg0.getActionCommand().equals("vergroessern"))
            {
                try
                {
                    Thread.sleep(100);
                }catch(Exception e)
                {
                    JOptionPane.showMessageDialog(null,"Fehler");
                }
                setLayout(new FlowLayout());
                setLocation(400, 200);
                setSize(600, 600);
                setVisible(true);
            }
            else if(arg0.getActionCommand().equals("verkleinern"))
            {
                try
                {
                    Thread.sleep(200);
                }catch(Exception e)
                {
                    JOptionPane.showMessageDialog(null,"Fehler");
                }
                setLayout(new FlowLayout());
                setSize(200, 200);
                setVisible(true);
                pack();
            }
            else if(arg0.getActionCommand().equals("Text anzeigen"))
            {
                setLayout(new GridLayout(2,1));
                setSize(200, 200);
                remove(vergroessern);
                remove(verkleinern);
                remove(schliessen);
                remove(textanzeigen);
                repaint();
                add(slider);
                slider.setName("groesser/kleiner");
                slider.addChangeListener(new ChangeListener()
                {
 
                     @Override
                     public void stateChanged(ChangeEvent e) 
                     {
                    	 Font copy = getLabel().getFont().deriveFont((float)getSlider().getValue());  // Cast auf float da du sonst den Style änderst !
                    	 getLabel().setFont(copy);
                     }
                });
                
                add(label = new JLabel("Hallo",JLabel.CENTER));
                setVisible(true);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
    }
    }
 
Zuletzt bearbeitet:
Danke schön! :-D
Es klappt tatsächlich! Oh man...
Ja, ich weiß. Mein Code ist an so manchen Stellen stark verbesserungsfähig. Aber in letzter Zeit komme ich nicht so oft zum programmieren. Was heißen soll, dass ich meinen Horizont dahingehend im Moment nicht so stark erweitern kann.
Aber das wird wahrscheinlich auch noch kommen 🙂
Erst noch einmal danke für deinen Tipp! 🙂
 

Zurück
Oben