在Java swing应用程序中更改字体样式、大小

在Java swing应用程序中更改字体样式、大小,java,swing,jcombobox,Java,Swing,Jcombobox,我正在用JavaSwing编写一个电子邮件应用程序。我希望用户能够在写电子邮件时更改字体,但我不知道如何做到这一点。 我创建了一个包含所有字体的JComboBox 我想我应该使用getSelectedItem()so并向JComboBox添加一个actionListener来将此信息传递到JTextArea?或者还有其他方法? 这是我的密码: String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailab

我正在用JavaSwing编写一个电子邮件应用程序。我希望用户能够在写电子邮件时更改字体,但我不知道如何做到这一点。 我创建了一个包含所有字体的JComboBox

我想我应该使用
getSelectedItem()
so并向JComboBox添加一个actionListener来将此信息传递到JTextArea?或者还有其他方法? 这是我的密码:

String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();

        JComboBox comboBox = new JComboBox(fonts);// create a combo box with the array
        comboBox.setFont(new Font("Times New Roman", Font.PLAIN, 12));// set the font
        comboBox.setBounds(21, 6, 193, 25);// set size and location
        add(comboBox);

我应该如何使所有文本字段根据组合框中的选定项更改字体?

在这里,您可以找到一个简单的main方法中嵌入的工作示例(如果我理解正确的话)

为了保持简单,我只使用了一个组合框来选择字体名称,但最好再放两个组合框,以便使字体大小和样式(粗体、普通、斜体)也可以选择

基本上是的,最常见的方法是将actionListener绑定到comboBox,以便在comboBox与用户交互时更改字体。当然,这不是唯一的方法,您甚至可以通过监听键盘按键来触发操作,或者实现其他一些方法来识别用户更改字体的意图,但据我所知,我在示例中使用的操作侦听器是最简单的方法

package fontchooser;

import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class ComboFont {

    // Put this in other two combo-boxes if you want to make these selectable by user
    public static int default_size = 16;
    public static int default_style = Font.PLAIN;

    public static void main(String[] args) {
        String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();

        GridBagLayout layout = new GridBagLayout();
        layout.columnWidths = new int[] {400};
        layout.rowHeights = new int[] {100,300};

        JFrame container = new JFrame();
        container.setLayout(layout);
        container.setBounds(150,150,400,400);
        container.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JComboBox<String> comboFontNames = new JComboBox<String>(fonts);
        JTextArea textArea = new JTextArea();
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewportView(textArea);

        GridBagConstraints comboContraints = new GridBagConstraints();
        comboContraints.gridx = 0;
        comboContraints.gridy = 0;
        // This only set font to display on combo
        comboFontNames.setFont(new Font("Times New Roman", Font.PLAIN, 12));
        container.add(comboFontNames, comboContraints);

        GridBagConstraints scrollerContraints = new GridBagConstraints();
        scrollerContraints.gridx = 0;
        scrollerContraints.gridy = 1;
        scrollerContraints.gridwidth = 400;
        scrollerContraints.fill = GridBagConstraints.BOTH;
        container.add(scrollPane, scrollerContraints);

        // Variant of action listener with lambda (since java 8)
        comboFontNames.addActionListener((e) -> {

            String selectedFamilyName = (String)comboFontNames.getSelectedItem();
            Font selectedFont = new Font(selectedFamilyName, default_style, default_size);

            textArea.setFont(selectedFont);
            textArea.repaint();
        });

        container.setVisible(true);
    }
}
package-fontcooser;
导入java.awt.Font;
导入java.awt.GraphicsEnvironment;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
公共类组合字体{
//如果您想让用户选择这些选项,请将其放在其他两个组合框中
公共静态int默认值_size=16;
公共静态int default_style=Font.PLAIN;
公共静态void main(字符串[]args){
String[]fonts=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
GridBagLayout=新的GridBagLayout();
layout.columnWidths=新int[]{400};
layout.rowHeights=newint[]{100300};
JFrame容器=新的JFrame();
容器。设置布局(布局);
集装箱立根(150400400);
container.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComboBox comboFontNames=新的JComboBox(字体);
JTextArea textArea=新的JTextArea();
JScrollPane scrollPane=新的JScrollPane();
scrollPane.setViewportView(文本区域);
GridBagConstraints comboContraints=新的GridBagConstraints();
combocontaints.gridx=0;
ComboControints.gridy=0;
//这仅将字体设置为在组合框上显示
comboFontNames.setFont(新字体(“Times new Roman”,Font.PLAIN,12));
container.add(comboFontNames、combocontaints);
GridBagConstraints ScrollerContrains=新的GridBagConstraints();
scrollerContraints.gridx=0;
scrollerContraints.gridy=1;
scrollerContraints.gridwidth=400;
scrollerContraints.fill=GridBagConstraints.BOTH;
添加(滚动窗格、滚动控件);
//带有lambda的动作侦听器的变体(自java 8以来)
comboFontNames.addActionListener((e)->{
字符串selectedFamilyName=(字符串)comboFontNames.getSelectedItem();
Font selectedFont=新字体(selectedFamilyName、默认样式、默认大小);
textArea.setFont(selectedFont);
textArea.repaint();
});
container.setVisible(true);
}
}
我希望这就是你需要的!再见


Alessio

“我想我应该使用getSelectedItem()so并向JComboBox添加一个actionListener来将此信息传递给JTextArea?”-这是一个很好的开始,希望,
JTextArea
只支持纯文本。您必须使用
JTextPane
,但是如果您希望文本的不同部分具有不同的字体,那么就需要使用@MadProgrammer建议的
JTextPane
(或
JEditorPane
)。但是,如果要更改所有文本的字体(在
JTextArea
中),则有一种方法