why are bold + italic not working?

試著忘記壹切 提交于 2019-12-12 02:51:25

问题


I am trying to display the entered text in both italic and bold form at the same time, but for some reason that condition is just not working. The text goes back to the first condition every time I check both the boxes. The code in the book is same as mine and also the codes on various websites seem to be the same too. I can't find the problem.
I tried ^ and + instead of | between the 2 fonts, still not working. This is within the ItemListener subclass:

Font f=null; // bold, italic - name of the checkboxes
  public void itemStateChanged(ItemEvent e) {
    if (italic.isSelected() )//1st condition
    f = new Font("Serif", Font.ITALIC, 30);
  else if (bold.isSelected() )
    f = new Font("Serif", Font.BOLD, 30);
  else if ( bold.isSelected() && italic.isSelected() )
    f = new Font("Serif", Font.BOLD | Font.ITALIC, 30);
  else 
    f = new Font("Serif", Font.PLAIN, 30);

  tf.setFont(f);// tf = object of JTextField
  }

回答1:


Take a look at your logic

if (italic.isSelected() )//1st condition
    f = new Font("Serif", Font.ITALIC, 30);
else if (bold.isSelected() )
    f = new Font("Serif", Font.BOLD, 30);
else if ( bold.isSelected() && italic.isSelected() )
    f = new Font("Serif", Font.BOLD | Font.ITALIC, 30);
else 
    f = new Font("Serif", Font.PLAIN, 30);

if italic.isSelected() then make the font italic, else if bold.isSelected(), make it bold, it's impossible for else if ( bold.isSelected() && italic.isSelected() ) to ever be evaluated

import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class FontTest {

    public static void main(String[] args) {
        new FontTest();
    }

    public FontTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;

            JTextField field = new JTextField("Bunch a munchy carrots");
            add(field, gbc);

            JToggleButton bold = new JToggleButton("Bold");
            JToggleButton italic = new JToggleButton("Italic");

            ActionListener listener = new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    Font font = field.getFont();
                    if (bold.isSelected() && italic.isSelected()) {
                        font = font.deriveFont(Font.BOLD | Font.ITALIC);
                    } else if (bold.isSelected()) {
                        font = font.deriveFont(Font.BOLD);
                    } else if (italic.isSelected()) {
                        font = font.deriveFont(Font.ITALIC);
                    } else {
                        font = font.deriveFont(Font.PLAIN);
                    }
                    field.setFont(font);
                }
            };

            bold.addActionListener(listener);
            italic.addActionListener(listener);

            add(bold);
            add(italic);
        }

    }

}



回答2:


Duplicate of: Can we combine 2 font styles together in Java?

Change your code to:

Font f = null; // bold, italic - name of the checkboxes
public void itemStateChanged(ItemEvent e) {
  if (italic.isSelected() )
    f = new Font("Serif", Font.ITALIC, 30);
  else if (bold.isSelected() )
    f = new Font("Serif", Font.BOLD, 30);
  else if ( bold.isSelected() && italic.isSelected() )
    f = new Font("Serif", Font.BOLD + Font.ITALIC, 30);
  else 
    f = new Font("Serif", Font.PLAIN, 30);

  tf.setFont(f);// tf = object of JTextField
}

EDIT

As @MadProgrammer pointed out, that logic is also wrong. If either italic and bold are selected, it will go into the italic if statement before it reaches the bold and italic statement.

This should fix your issue:

Font f = null; // bold, italic - name of the checkboxes
public void itemStateChanged(ItemEvent e) {
  if (italic.isSelected() && !bold.isSelected())
    f = new Font("Serif", Font.ITALIC, 30);
  else if (bold.isSelected() && !italic.isSelected())
    f = new Font("Serif", Font.BOLD, 30);
  else if ( bold.isSelected() && italic.isSelected() )
    f = new Font("Serif", Font.BOLD + Font.ITALIC, 30);
  else 
    f = new Font("Serif", Font.PLAIN, 30);

  tf.setFont(f);// tf = object of JTextField
}


来源:https://stackoverflow.com/questions/32345162/why-are-bold-italic-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!