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.
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.
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.
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).
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) {
}
}
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) {
}
}
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.
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) {
}
}
Dzieki, o to mi chodzilo :)