我创建了一个基本的 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());
--
关于java - 当选择 JCheckButtons 时,需要使我的 texfield 输出为粗体、斜体和两者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35232429/