我正在制作缩小的文本编辑器。有一个JLabel,它应该是斜体,粗体和不同的字体等等。这已经有效,但我有一个问题,当文本是斜体和粗体时,只删除其中一个,再次单击该选项。例如。当它是斜体和粗体时,我再次点击斜体,它也会删除粗体。
我的代码看起来像这样(斜体示例,粗体看起来一样):
italic.addActionListener(
e -> {
if(text.getFont().getStyle() != Font.ITALIC) {
Font f = new Font(text.getFont().getName(), text.getFont().getStyle() | Font.ITALIC, text.getFont().getSize());
text.setFont(f);
} else {
Font f = new Font(text.getFont().getName(), text.getFont().getStyle() - Font.ITALIC, text.getFont().getSize());
text.setFont(f);
}
}
);
我提出的唯一解决方案是检查每个可能的情况,但我想有一个更简单的解决方案。
答案 0 :(得分:3)
您可以使用XOR运算符^
翻转所需的字体样式位。
斜体的掩码为2,粗体的掩码为1。
例如:
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class TestBitFlip extends JPanel {
private JLabel label = new JLabel("Fubarlicious!");
public TestBitFlip() {
add(label);
add(new JButton(new FontAction("Bold", KeyEvent.VK_B, Font.BOLD)));
add(new JButton(new FontAction("Italic", KeyEvent.VK_I, Font.ITALIC)));
}
private class FontAction extends AbstractAction {
private int mask;
public FontAction(String name, int mnemonic, int mask) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
this.mask = mask;
}
@Override
public void actionPerformed(ActionEvent e) {
Font font = label.getFont();
int style = font.getStyle();
style ^= mask;
font = font.deriveFont(style);
label.setFont(font);
}
}
private static void createAndShowGui() {
TestBitFlip mainPanel = new TestBitFlip();
JFrame frame = new JFrame("TestBitFlip");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}