Java skalowanie czcionki

0

hej mam problem szukałem w googlach i na stronie suna ale nie potrafię znaleźć tam nic konkretnego a mianowicie chodzi mi o skalowanie czcionki. Np. Mam okno z JLabel i tam jakiś tekst i chce żeby wraz ze zmianą rozmiaru okna czcionka się skalowała. Stąd moje pytanie jaka funkcja jest odpowiedzialna za taka operacje i czy trzeba używać jakiś konkretnych czcionek czy to działa na wszystkich ?? Bardzo proszę o pomoc.

0

Chyba kiepsko szukasz. Obsłuż metodę componentResized() ComponentListenera.
BTW, ja bym nie lubił jak by mi się przy zmianie rozmiaru okna zmieniała wielkość czcionki.

0

Użyj metody setFont dla JLabel. Na przykład dla zmiennej jLabel byłby tak:

int rozmiarCzcionki = skala * jlabel.getWidth() * jlabel.getHeight(); //skala zależna tu od powierzchni
Font f = jlabel.getFont();
jlabel.setFont(new Font(f.getFontName(), f.getStyle(), rozmiarCzcionki));

Poziom skalowania musisz sobie wyliczyć lub dobrać metodą prób i błędów.
Oczywiście w ten sam sposób możesz sobie zmienić czcionkę, styl, a za pomocą metod Font również bardziej szczegółowe rzeczy. Można taki kod wrzucić do obsługi componentResized() listenera dla obiektu JLabel, ale równie dobrze może być wywoływany zupełnie z poza niego.

Jest też metoda alternatywna. Polega ona na tym, że polecenie zmiany wielkości czcionki wrzucamy w formacie html do tekstu, który jest przez JLabel wyświetlany. Komponenty Swing obsługują html, a przynajmniej formatowanie w nim zawarte. Jest to jednak moim zdaniem mniej wygodne bo trzeba się bawić we wklejanie liczb do tekstu i formatowanie html dla etykietki.

0

Jeszcze dwie sprawy, użytkownik zmienia rozmiar okna (JFrame) , nie wiem czy automatycznie zmienia się rozmiar JLabel. Jeżeli nie, to musisz ComponentListenera podpiąć do okna i w obsłudze zdarzenia wpierw zmienić rozmiar JLabel. Do zmiany wielkości czcionki wygodniej jest użyć metody deriveFont(newSize).

0
Olamagato napisał(a)

Użyj metody setFont dla JLabel. Na przykład dla zmiennej jLabel byłby tak:

int rozmiarCzcionki = skala * jlabel.getWidth() * jlabel.getHeight(); //skala zależna tu od powierzchni
Font f = jlabel.getFont();
jlabel.setFont(new Font(f.getFontName(), f.getStyle(), rozmiarCzcionki));

> Poziom skalowania musisz sobie wyliczyć lub dobrać metodą prób i błędów.
> Oczywiście w ten sam sposób możesz sobie zmienić czcionkę, styl, a za pomocą metod Font również bardziej szczegółowe rzeczy. Można taki kod wrzucić do obsługi componentResized() listenera dla obiektu JLabel, ale równie dobrze może być wywoływany zupełnie z poza niego.
> 
> Jest też metoda alternatywna. Polega ona na tym, że polecenie zmiany wielkości czcionki wrzucamy w formacie html do tekstu, który jest przez JLabel wyświetlany. Komponenty Swing obsługują html, a przynajmniej formatowanie w nim zawarte. Jest to jednak moim zdaniem mniej wygodne bo trzeba się bawić we wklejanie liczb do tekstu i formatowanie html dla etykietki.


No a jak konkretnie wyliczasz ten współczynnik?
Prosze niech ktos z tym pomoze bo sie mecze juz nie wiadomo ile i utknalem.
Ponizej wklejam kod do testowania. Brakuje wlasnie zmiany rozmiaru czcionki.

import java.awt.*;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.*;

public class Test extends JFrame implements ComponentListener{
public void text(){

int fontSize = 32;
addComponentListener(this);
setLayout(new BorderLayout());
JLabel label = new JLabel("KONIEC");
label.setFont(new Font("Helvetica", Font.BOLD, fontSize));
label.setVerticalAlignment(SwingConstants.CENTER);
label.setHorizontalAlignment(SwingConstants.CENTER);
add(label, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
pack();
}

public static void main(String args[]){
new Test().text();
}

@Override
public void componentHidden(ComponentEvent arg0) {

}

@Override
public void componentMoved(ComponentEvent arg0) {

}

@Override
public void componentResized(ComponentEvent arg0) {

}

@Override
public void componentShown(ComponentEvent arg0) {

}
}

0

Decyzja jak zmienić czcionkę jeżeli użytkownik nie zmienił wysokości i rozciągnął w poziomie 5 razy należy do Ciebie.
Masz schemat programu:

import java.awt.*;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.*;

public class Test extends JFrame implements ComponentListener
{
    int width;
    int height;
    JLabel label;
 public void text(){

  int fontSize = 32;
  addComponentListener(this);
  setLayout(new BorderLayout());
  label = new JLabel("KONIEC");
  label.setFont(new Font("Helvetica", Font.BOLD, fontSize));
  label.setVerticalAlignment(SwingConstants.CENTER);
  label.setHorizontalAlignment(SwingConstants.CENTER);
  add(label, BorderLayout.CENTER);
  pack();
  width=label.getWidth();
  height=label.getHeight();
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setVisible(true);

 }

 public static void main(String args[]){
  new Test().text();
 }

 @Override
 public void componentHidden(ComponentEvent arg0) {

 }

 @Override
 public void componentMoved(ComponentEvent arg0) {

 }

 @Override
 public void componentResized(ComponentEvent arg0)
 {
    int w=label.getWidth();
    int h=label.getHeight();
    //tutaj na podstawie stosunków w/width oraz h/height wyliczasz współczynnik skalowania
    //i zmieniasz wielkość czcionki
    width=w;
    height=h;
 }

 @Override
 public void componentShown(ComponentEvent arg0) {

 }
}
0

Program powinien startowac z ustawiona domyslnie wielkoscia czcionki (w przykladowym kodzie to jest "32"). Napis powinien byc skalowany tak aby uzyc mozliwie najwiekszej powierzchni i nie zostać uciętym (napis poziomy). Problem polega na tym, ze pole powierzchni nie rosnie o ten sam rzad wielkosci co czcionka.

0

Coś w tym rodzaju.

import java.awt.*;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.*;
import java.awt.geom.*;

public class Test extends JFrame implements ComponentListener
{
    private int width;
    private int height;
    private JLabel label;
    private int fontSize=32;
    private Font font=new Font("Helvetica", Font.BOLD, fontSize);

    public void text()
    {

        addComponentListener(this);
        setLayout(new BorderLayout());
        label = new JLabel("KONIEC");
        label.setFont(font);
        label.setVerticalAlignment(SwingConstants.CENTER);
        label.setHorizontalAlignment(SwingConstants.CENTER);
        add(label, BorderLayout.CENTER);
        pack();
        width=label.getWidth();
        height=label.getHeight();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String args[]){
        new Test().text();
    }

    @Override
    public void componentHidden(ComponentEvent arg0) {

    }

    @Override
    public void componentMoved(ComponentEvent arg0) {

    }

    @Override
    public void componentResized(ComponentEvent arg0)
    {
        int w=label.getWidth();
        int h=label.getHeight();
        AffineTransform at=new AffineTransform(0.9*(float)w/width,0.0f,0.0f,0.9*(float)h/height,0.0f,0.0f);
        Font newFont=font.deriveFont(at);
        label.setFont(newFont);
    }

    @Override
    public void componentShown(ComponentEvent arg0) {

    }
}
0

Dzieki, o to mi chodzilo :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1