【问题标题】:Need to make my texfield output bold, italic and both when the JCheckButtons are selected选择选定按钮时,需要使我的文本字段输出粗体,斜体和两者都有
【发布时间】:2016-05-15 22:03:16
【问题描述】:

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

这是我的 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);
}
}

这里是我的动作监听器类:

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,但它是我最初打算如何布局我的动作侦听器的方式

class FontSetter {

void setBold() {

}

void setItalic() {

}

void setBoldItalic() {

}

void setTimes() {

}

void setHelvetica() {

}

void setCourier() {

}
}

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖minimal reproducible exampleShort, Self Contained, Correct Example
  • "将字体名称从单选按钮复制到文本字段" 当前代码非常脆弱,因为它需要安装特定的字体。 Windows 机器可能没有安装 Helvetica。我刚刚检查了这个 Windows 框,虽然它安装了 250 多个字体系列,但其中没有一个是“Helvetica”。要获得该机器上真正存在的字体系列,请参阅String[] fontFamilies = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); ..(然后我会将它们以JComboBoxJList 的形式呈现给用户。)

标签: java swing user-interface actionlistener jtextfield


【解决方案1】:

您可以在 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

【讨论】:

  • 非常感谢。这是迄今为止最好的解决方案。作为一个小插件:您可以检查 if (g instanceof Graphics2D) - 如果是这种情况,请使用 g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);获取抗锯齿文本。
猜你喜欢
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 2011-05-06
  • 2011-11-17
  • 2010-10-12
  • 1970-01-01
相关资源
最近更新 更多