【发布时间】: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 example 或Short, Self Contained, Correct Example。
-
"将字体名称从单选按钮复制到文本字段" 当前代码非常脆弱,因为它需要安装特定的字体。 Windows 机器可能没有安装 Helvetica。我刚刚检查了这个 Windows 框,虽然它安装了 250 多个字体系列,但其中没有一个是“Helvetica”。要获得该机器上真正存在的字体系列,请参阅
String[] fontFamilies = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();..(然后我会将它们以JComboBox或JList的形式呈现给用户。)
标签: java swing user-interface actionlistener jtextfield