删除斜体或粗体,而不删除其他格式

时间:2015-04-18 12:56:23

标签: java swing fonts

我正在制作缩小的文本编辑器。有一个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);
                }
            }
        );

我提出的唯一解决方案是检查每个可能的情况,但我想有一个更简单的解决方案。

1 个答案:

答案 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();
         }
      });
   }
}