如何根据其大小更改JButton的字体大小? [英] How to change font size of JButton according to its size?

查看:252
本文介绍了如何根据其大小更改JButton的字体大小?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Java应用程序 - 一个计算器。我想动态调整应用程序窗口的大小来调整按钮的字体大小。如何实现它?



我的想法是使用ComponentEvents。我有初始大小的应用程序窗口和初始字体的大小。我想根据按钮的大小更改字体大小,受窗口大小更改的影响。问题是如何在重写方法中使用比率[初始窗口大小] / [初始字体大小]?每个字体的比例是不同的。

  import javax.swing。*; 
import java.awt。*;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
$ b public class Main扩展JFrame {
public Main(){
super(Test);

JPanel cPane =(JPanel)getContentPane();
cPane.setLayout(new BorderLayout());
MyButton sampleButton = new MyButton(Sample text);
sampleButton.setFont(new Font(Sans Serif,Font.PLAIN,20));

MyButton a,b,c,d;
a = new MyButton(a);
b = new MyButton(b);
c = new MyButton(c);
d = new MyButton(d);




cPane.add(a,BorderLayout.PAGE_START);
cPane.add(b,BorderLayout.PAGE_END);
cPane.add(c,BorderLayout.LINE_START);
cPane.add(d,BorderLayout.LINE_END);

cPane.add(sampleButton,BorderLayout.CENTER);
setSize(300,200);
setResizable(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);


public static void main(String ... args){
new Main();
}

class MyButton继承JButton实现ComponentListener {
public MyButton(String title){
super(title);

$ b @Override
public void componentResized(ComponentEvent e){
//调整字体大小
}

@Override
public void componentMoved(ComponentEvent e){

}

@Override
public void componentShown(ComponentEvent e){

}

@Override
public void componentHidden(ComponentEvent e){




$看看你如何使用这个代码去使用 GlyphVector c $ c>来确定最适合的 Font


  • 除非在设置可见框架和添加 ComponentListener 之间有延迟, code>。我通过延迟添加侦听器来解决这个问题Swing Timer

  • 是基于 ScriptEngine





  import java.awt。*; 
import java.awt.event。*;
import java.awt.font。*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import javax.swing。*;
import javax.swing.border.EmptyBorder;
import java.util.ArrayList;
import javax.script。*;
import javax.swing.border.Border;

类SwingCalculator实现了ActionListener,KeyListener {

JTextField io;
ScriptEngine引擎;
ArrayList< JButton>控制;
final BufferedImage textImage = new BufferedImage(
100,100,
BufferedImage.TYPE_INT_ARGB);

public int getMaxFontSizeForControls(){
Graphics2D g = textImage.createGraphics();
FontRenderContext frc = g.getFontRenderContext();
int maxSize = 500;
for(JButton b:controls){
// skip the = button ..
if(!b.getText()。equals(=)){
int max = getMaxFontSizeForControl(b,frc);
if(maxSize> max){
maxSize = max;
}
}
}
g.dispose();
返回maxSize;


public int getMaxFontSizeForControl(JButton button,FontRenderContext frc){
Rectangle r = button.getBounds();
Insets m = button.getMargin();
Insets i = button.getBorder()。getBorderInsets(button);
Rectangle viewableArea = new Rectangle(
r.width -
(m.right + m.left + i.left + i.right),
r.height -
(m.top + m.bottom + i.top + i.bottom)
);
Font font = button.getFont();
int size = 1;
boolean tooBig = false; (!tooBig){
Font f = font.deriveFont((float)size);

GlyphVector gv = f.createGlyphVector(frc,button.getText());
Rectangle2D box = gv.getVisualBounds();
if(box.getHeight()> viewableArea.getHeight()
|| box.getWidth()> viewableArea.getWidth()){
tooBig = true;
size--;
}
size ++;
}
返回大小;


SwingCalculator(){
//获取对JS引擎的引用
engine = new ScriptEngineManager()。getEngineByExtension(js);

JPanel gui = new JPanel(新的BorderLayout(2,2));
controls = new ArrayList< JButton>();

JPanel text = new JPanel(new GridLayout(0,1,3,3));
gui.add(text,BorderLayout.NORTH);
io = new JTextField(15);
Font font = io.getFont();
font = font.deriveFont(font.getSize()* 1.7f);
io.setFont(font);
io.setHorizo​​ntalAlignment(SwingConstants.TRAILING);
io.setFocusable(false);
text.add(io);

JPanel按钮= new JPanel(新的GridLayout(4,4,2,2));
gui.add(buttons,BorderLayout.CENTER);
addButton(按钮,7);
addButton(按钮,8);
addButton(按钮,9);
addButton(buttons,/);

addButton(按钮,4);
addButton(按钮,5);
addButton(按钮,6);
addButton(按钮,*);

addButton(按钮,1);
addButton(按钮,2);
addButton(按钮,3);
addButton(buttons, - );

addButton(buttons,0);
addButton(buttons,。);
addButton(按钮,C);
addButton(按钮,+);

JButton equals = new JButton(=);
equals.addKeyListener(this);
controls.add(等于);
equals.addActionListener(this);
gui.add(等于,BorderLayout.EAST);

gui.setBorder(new EmptyBorder(5,5,5));

final JFrame f = new JFrame(Calculet);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(gui);
f.pack();
f.setMinimumSize(f.getSize());
f.setLocationByPlatform(true);
f.setVisible(true);

final ComponentListener cl = new ComponentAdapter(){
$ b $ @Override
public void componentResized(ComponentEvent e){
int ii = getMaxFontSizeForControls();
for(JButton b:controls){
if(!b.getText()。equals(=)){
b.setFont(b.getFont()。deriveFont(( float)ii));
}
}
}
};
ActionListener al = new ActionListener(){
$ b @Override
public void actionPerformed(ActionEvent e){
f.addComponentListener(cl);
}
};
定时器t =新定时器(500,al);
t.setRepeats(false);
t.start();

$ b $ public void addButton(Container c,String text){
JButton b = new JButton(text);
b.addActionListener(this);
b.addKeyListener(this);
controls.add(b);
c.add(b);

$ b $ public void calculateResult(){
try {
Object result = engine.eval(io.getText());
if(result == null){
io.setText(Output was'null');
} else {
io.setText(result.toString());

} catch(ScriptException se){
io.setText(se.getMessage());


$ b $ public void actionPerformed(ActionEvent ae){
String command = ae.getActionCommand();
if(command.equals(C)){
io.setText();
} else if(command.equals(=)){
calculateResult();
} else {
io.setText(io.getText()+ command);


$ b $ private JButton getButton(String text){
for(JButton button:controls){
String s = button.getText() ;
if(text.endsWith(s)
||(s.equals(=)
&&(text.equals(Equals)|| text.equals Enter)))){

return button;
}
}
返回null;
}

/ *
*开始 - 因为我讨厌老鼠。
* /
public void keyPressed(KeyEvent ke){
}

public void keyReleased(KeyEvent ke){
String s = ke.getKeyText ke.getKeyCode());
JButton b = getButton(s);
if(b!= null){
b.requestFocusInWindow();
b.doClick();



public void keyTyped(KeyEvent ke){
}

public static void main(String [] args){
Runnable r = new Runnable(){

@Override
public void run(){
new SwingCalculator();
}
};
// Swing GUIs应该在EDT
上创建和更新// http://docs.oracle.com/javase/tutorial/uiswing/concurrency
SwingUtilities.invokeLater(r);
}
}


I have a java application - a calculator. I want to resize font of buttons dynamically with resizing the window of the app. How to implement it?

My idea is using ComponentEvents. I have initial size of the window of application and initial fonts' sizes. I want to change font size according to button's size, affected by window size change. The problem is how to use the ratio [initial window size] / [initial font size] in the overriden method? The ratio is different for each font.

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

public class Main extends JFrame {
    public Main() {
        super("Test");

        JPanel cPane = (JPanel) getContentPane();
        cPane.setLayout(new BorderLayout());
        MyButton sampleButton = new MyButton("Sample text");
        sampleButton.setFont(new Font("Sans Serif", Font.PLAIN, 20));

        MyButton a, b, c, d;
        a = new MyButton("a");
        b = new MyButton("b");
        c = new MyButton("c");
        d = new MyButton("d");




        cPane.add(a, BorderLayout.PAGE_START);
        cPane.add(b, BorderLayout.PAGE_END);
        cPane.add(c, BorderLayout.LINE_START);
        cPane.add(d, BorderLayout.LINE_END);

        cPane.add(sampleButton, BorderLayout.CENTER);
        setSize(300, 200);
        setResizable(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String... args) {
        new Main();
    }

    class MyButton extends JButton implements ComponentListener {
        public MyButton(String title) {
            super(title);
        }

        @Override
        public void componentResized(ComponentEvent e) {
            //resizing font
        }

        @Override
        public void componentMoved(ComponentEvent e) {

        }

        @Override
        public void componentShown(ComponentEvent e) {

        }

        @Override
        public void componentHidden(ComponentEvent e) {

        }
    }
}

解决方案

See how you go with this code using GlyphVector to determine the largest Font that will fit.

import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.util.ArrayList;
import javax.script.*;
import javax.swing.border.Border;

class SwingCalculator implements ActionListener, KeyListener {

    JTextField io;
    ScriptEngine engine;
    ArrayList<JButton> controls;
    final BufferedImage textImage = new BufferedImage(
            100, 100,
            BufferedImage.TYPE_INT_ARGB);

    public int getMaxFontSizeForControls() {
        Graphics2D g = textImage.createGraphics();
        FontRenderContext frc = g.getFontRenderContext();
        int maxSize = 500;
        for (JButton b : controls) {
            // skip the = button..
            if (!b.getText().equals("=")) {
                int max = getMaxFontSizeForControl(b, frc);
                if (maxSize > max) {
                    maxSize = max;
                }
            }
        }
        g.dispose();
        return maxSize;
    }

    public int getMaxFontSizeForControl(JButton button, FontRenderContext frc) {
        Rectangle r = button.getBounds();
        Insets m = button.getMargin();
        Insets i = button.getBorder().getBorderInsets(button);
        Rectangle viewableArea = new Rectangle(
                r.width - 
                (m.right + m.left + i.left + i.right),
                r.height - 
                (m.top + m.bottom + i.top + i.bottom)
                );
        Font font = button.getFont();
        int size = 1;
        boolean tooBig = false;
        while (!tooBig) {
            Font f = font.deriveFont((float) size);
            GlyphVector gv = f.createGlyphVector(frc, button.getText());
            Rectangle2D box = gv.getVisualBounds();
            if (box.getHeight() > viewableArea.getHeight()
                    || box.getWidth() > viewableArea.getWidth()) {
                tooBig = true;
                size--;
            }
            size++;
        }
        return size;
    }

    SwingCalculator() {
        // obtain a reference to the JS engine
        engine = new ScriptEngineManager().getEngineByExtension("js");

        JPanel gui = new JPanel(new BorderLayout(2, 2));
        controls = new ArrayList<JButton>();

        JPanel text = new JPanel(new GridLayout(0, 1, 3, 3));
        gui.add(text, BorderLayout.NORTH);
        io = new JTextField(15);
        Font font = io.getFont();
        font = font.deriveFont(font.getSize() * 1.7f);
        io.setFont(font);
        io.setHorizontalAlignment(SwingConstants.TRAILING);
        io.setFocusable(false);
        text.add(io);

        JPanel buttons = new JPanel(new GridLayout(4, 4, 2, 2));
        gui.add(buttons, BorderLayout.CENTER);
        addButton(buttons, "7");
        addButton(buttons, "8");
        addButton(buttons, "9");
        addButton(buttons, "/");

        addButton(buttons, "4");
        addButton(buttons, "5");
        addButton(buttons, "6");
        addButton(buttons, "*");

        addButton(buttons, "1");
        addButton(buttons, "2");
        addButton(buttons, "3");
        addButton(buttons, "-");

        addButton(buttons, "0");
        addButton(buttons, ".");
        addButton(buttons, "C");
        addButton(buttons, "+");

        JButton equals = new JButton("=");
        equals.addKeyListener(this);
        controls.add(equals);
        equals.addActionListener(this);
        gui.add(equals, BorderLayout.EAST);

        gui.setBorder(new EmptyBorder(5, 5, 5, 5));

        final JFrame f = new JFrame("Calculet");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(gui);
        f.pack();
        f.setMinimumSize(f.getSize());
        f.setLocationByPlatform(true);
        f.setVisible(true);

        final ComponentListener cl = new ComponentAdapter() {

            @Override
            public void componentResized(ComponentEvent e) {
                int ii = getMaxFontSizeForControls();
                for (JButton b : controls) {
                    if (!b.getText().equals("=")) {
                        b.setFont(b.getFont().deriveFont((float) ii));
                    }
                }
            }
        };
        ActionListener al = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                f.addComponentListener(cl);
            }
        };
        Timer t = new Timer(500, al);
        t.setRepeats(false);
        t.start();
    }

    public void addButton(Container c, String text) {
        JButton b = new JButton(text);
        b.addActionListener(this);
        b.addKeyListener(this);
        controls.add(b);
        c.add(b);
    }

    public void calculateResult() {
        try {
            Object result = engine.eval(io.getText());
            if (result == null) {
                io.setText("Output was 'null'");
            } else {
                io.setText(result.toString());
            }
        } catch (ScriptException se) {
            io.setText(se.getMessage());
        }
    }

    public void actionPerformed(ActionEvent ae) {
        String command = ae.getActionCommand();
        if (command.equals("C")) {
            io.setText("");
        } else if (command.equals("=")) {
            calculateResult();
        } else {
            io.setText(io.getText() + command);
        }
    }

    private JButton getButton(String text) {
        for (JButton button : controls) {
            String s = button.getText();
            if (text.endsWith(s)
                    || (s.equals("=")
                    && (text.equals("Equals") || text.equals("Enter")))) {

                return button;
            }
        }
        return null;
    }

    /*
     * START - Because I hate mice.
     */
    public void keyPressed(KeyEvent ke) {
    }

    public void keyReleased(KeyEvent ke) {
        String s = ke.getKeyText(ke.getKeyCode());
        JButton b = getButton(s);
        if (b != null) {
            b.requestFocusInWindow();
            b.doClick();
        }
    }

    public void keyTyped(KeyEvent ke) {
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                new SwingCalculator();
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}

这篇关于如何根据其大小更改JButton的字体大小?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆