java - 当选择 JCheckButtons 时,需要使我的 texfield 输出为粗体、斜体和两者

标签 java swing user-interface actionlistener jtextfield

我创建了一个基本的 GUI,其中有 2 个 JCheckButtons(粗体、斜体)和 3JRadioButtons,位于字体样式(times、helvetica、courier)的按钮组中。还有一个文本字段,它将显示字体样式的字符串,例如该样式中的时间,如果按下粗体或斜体按钮,则文本也将变为粗体或斜体(或两者)。到目前为止,我已成功添加操作监听器,将字体名称从单选按钮复制到文本字段,但我无法使该文本采用关联的字体样式。我的粗体和斜体按钮的功能也遇到问题。

这是我的 GUI 布局的代码(布局是我想要的,唯一的问题是我的按钮的功能:

package weekTwo;
import javax.swing.*;
import java.awt.*;
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class taskTwo {

public static void main(String[] args) {
    JFrame window = new JFrame("Font Chooser");
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setSize(500, 100);

    FontSetter fontSetter = new FontSetter();

    Container pane = window.getContentPane();
    pane.setLayout(new GridBagLayout());

    GridBagConstraints gbc = new GridBagConstraints();

    JTextField text = new JTextField();
    gbc.gridx = 2;
    gbc.gridy = 2;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.insets = new Insets(0, 0, 5, 5); //padding constraints
    gbc.fill = GridBagConstraints.BOTH;   //text field fills cell
    pane.add(text, gbc);

    JCheckBox bold = new JCheckBox("Bold");
    gbc.gridx = 0; //sets x position to 0
    gbc.gridy = 1;
    bold.addActionListener(new Bold(fontSetter, text));
    pane.add(bold, gbc);

    JCheckBox italic = new JCheckBox("Italic");
    gbc.gridx = 0;
    gbc.gridy = 3;
    italic.addActionListener(new Italic(fontSetter, text));
    pane.add(italic, gbc);

    JRadioButton times = new JRadioButton("Times", true);
    gbc.gridx = 1;
    gbc.gridy = 0;
    times.addActionListener(new Times(fontSetter, text));
    pane.add(times, gbc);

    JRadioButton helvetica = new JRadioButton("Helvetica", false);
    gbc.gridx = 1;
    gbc.gridy = 2;
    helvetica.addActionListener(new Helvetica(fontSetter, text));
    pane.add(helvetica, gbc);

    JRadioButton courier = new JRadioButton("Courier", false);
    gbc.gridx = 1;
    gbc.gridy = 4;
    courier.addActionListener(new Courier(fontSetter, text));
    pane.add(courier, gbc);

    ButtonGroup fonts = new ButtonGroup();  //now only one of these buttons can be selected at once
    fonts.add(times);
    fonts.add(helvetica);
    fonts.add(courier);

    JButton ok = new JButton("OK");
    gbc.gridx = 3;
    gbc.gridy = 2;
    //ok.addActionListener();
    pane.add(ok, gbc);

    window.setVisible(true);
}
}

这是我的 Action 监听器的类:

class Bold implements ActionListener {

private final FontSetter fontSetter;
private final JTextField textfield;

Bold(FontSetter fontSetter, JTextField textfield) {
    this.fontSetter = fontSetter;
    this.textfield = textfield;
}

Font font;

public void actionPerformed(ActionEvent e) {
    textfield.setFont(font.deriveFont(Font.BOLD));
}

}

class Italic implements ActionListener {

private final FontSetter fontSetter;
private final JTextField textfield;

Italic(FontSetter fontSetter, JTextField textfield) {
    this.fontSetter = fontSetter;
    this.textfield = textfield;
}

public void actionPerformed(ActionEvent e) {
    textfield.setText("");
}

}

class BoldItalic implements ActionListener {

private final FontSetter fontSetter;
private final JTextField textfield;

BoldItalic(FontSetter fontSetter, JTextField textfield) {
    this.fontSetter = fontSetter;
    this.textfield = textfield;
}

public void actionPerformed(ActionEvent e) {
    textfield.setText("");
}

}

class Times implements ActionListener {

private final FontSetter fontSetter;
private final JTextField textfield;

Times(FontSetter fontSetter, JTextField textfield) {
    this.fontSetter = fontSetter;
    this.textfield = textfield;
}

public void actionPerformed(ActionEvent e) {
    textfield.setText("Times");
}

}

class Helvetica implements ActionListener {

private final FontSetter fontSetter;
private final JTextField textfield;

Helvetica(FontSetter fontSetter, JTextField textfield) {
    this.fontSetter = fontSetter;
    this.textfield = textfield;
}

public void actionPerformed(ActionEvent e) {
    textfield.setText("Helvetica");
}

}

class Courier implements ActionListener {

private final FontSetter fontSetter;
private final JTextField textfield;

Courier(FontSetter fontSetter, JTextField textfield) {
    this.fontSetter = fontSetter;
    this.textfield = textfield;
}

public void actionPerformed(ActionEvent e) {
    textfield.setText("Courier");
}

}

我希望我已经清楚地解释了这一点,并且希望对我的代码有任何帮助,谢谢。

p.s 也是我的 fontsetter 类,它没有任何 atm 功能,但这是我最初打算布局我的 Action 监听器的方式

class FontSetter {

void setBold() {

}

void setItalic() {

}

void setBoldItalic() {

}

void setTimes() {

}

void setHelvetica() {

}

void setCourier() {

}
}

最佳答案

您可以在 FontSetter 类中定义一些变量来保留当前的字体名称和样式

类似这样的事情

class FontSetter {

private final JTextField text;
private String fontName = "Times";
private boolean isBold = false;
private boolean isItalic = false;

FontSetter(JTextField text) {
    this.text = text;
}

void setBold(boolean flag) {
    isBold = flag;
    applyFontChanges();
}

void setItalic(boolean flag) {
    isItalic = flag;
    applyFontChanges();
}

void setFontName(String fontName) {
    this.fontName = fontName;
    applyFontChanges();
}

private void applyFontChanges(){
    Font font;
    int style;

    if(isBold && isItalic){
        style = Font.BOLD + Font.ITALIC;
    } else if(isBold){
        style = Font.BOLD;
    } else if(isItalic){
        style = Font.ITALIC;
    } else {
        style = Font.PLAIN;
    }

    font = new Font(fontName, style, 12);
    text.setFont(font );
}   
}

然后您可以在 ActionListeners 中使用它来更改字体,如下所示

fontSetter.setFontName("Courier");
textfield.setText("Courier");

您还可以更改样式,如下所示

JCheckBox ch = (JCheckBox) e.getSource();
fontSetter.setBold(ch.isSelected());

--

Here is the complete code snippet

关于java - 当选择 JCheckButtons 时,需要使我的 texfield 输出为粗体、斜体和两者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35232429/

相关文章:

java - 集成 .net 和 java 应用程序的架构建议

java - 关于使用 mock stripe 进行端到端测试

java - Eclipse 桌面应用程序

JProgressBar 内部的 Java swing 不透明 JProgressBar

python - 创建一个生成新列表的交互式 Python GUI

java - 创建具有特定高度的空表并在 SWT 中单击按钮时重绘

java - 从外部类创建 JPanel 并将其附加到主 Jframe

java - 配置 GUI 时出现问题

java - 如何使用 Action 监听器从按钮获取背景颜色

java - 使用 Java 将字符串数组写入文件 - 单独的行