Showing posts with label Font. Show all posts
Showing posts with label Font. Show all posts

Thursday, October 2, 2014

How to make JTextArea display a fixed number of characters each line

There are two ways to achieve this result. One way is to use the setRows and setColumns method to set the size of the JTextArea. The other way is making your text area the subclass of the JTextArea and override the paint() method to get the width and height of the font used. Then, set the size of your text area.

Since for many types of font, the characters do not always have the same widths, some characters are wider than the others, it is better that you use the monospaced font for achieving a constant result.

Following is an example.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class CharInLine {
    private int charWidth = 0;
    private int charHeight = 0;
    private int charPerLine = 30;
 
    public CharInLine() {
        MyTextArea textArea = new MyTextArea();
        textArea.setFont(new Font("monospaced", Font.PLAIN, 12));
     
        //Method 1
        //setting the rows and columns is important for an
        //empty JTextArea to show its size.
        textArea.setRows(5);
        textArea.setColumns(30);
        textArea.setBorder(BorderFactory.createTitledBorder("Text Area"));
     
        //Method 2
        //designate 30 characters per line and 5 lines in the text area
        textArea.setLineWrap(true);
        textArea.setSize(new Dimension(charWidth*charPerLine, charHeight*5));
        //textArea.setPreferredSize(new Dimension(charWidth*charPerLine, charHeight*5));    

        JPanel panel = new JPanel();
        panel.add(textArea);
     
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel,BorderLayout.CENTER);
        frame.setSize(500, 300);
     
        frame.setVisible(true);
    }
 
    private class MyTextArea extends JTextArea {
        @Override
        public void paint(Graphics g){
            super.paint(g);
            FontMetrics fm = g.getFontMetrics();
            charWidth = fm.charWidth('M');
            charHeight = fm.getHeight();
        }
    }
 
    public int getCharWidth() {
        return charWidth;
    }
 
    public static void main(String[] args){
        new CharInLine();
    }
}

Reference:

1. setSize vs setPreferredSize in JTextArea, JTextField, JButton, JLabel, JPanel and JFrame

-----------------------------------------------------------------------------------------------------------------

                        
If you have ever asked yourself these questions, this is the book for you. What is the meaning of life? Why do people suffer? What is in control of my life? Why is life the way it is? How can I stop suffering and be happy? How can I have a successful life? How can I have a life I like to have? How can I be the person I like to be? How can I be wiser and smarter? How can I have good and harmonious relations with others? Why do people meditate to achieve enlightenment? What is the true meaning of spiritual practice? Why all beings are one? Read the book free here.

Friday, May 30, 2014

Setting text styles, colors, font and alignment in JTextPane (2): html

You can also setting the styles, colors, font and other character of the text in JTextPane using html. Following is an example code.

import java.awt.Color;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;

public class HtmlTest extends JTextPane {
 
    public static void main(String[] args){
        //create the JTextPane and set the ContentType to text/html
        HtmlTest test = new HtmlTest();
        test.setContentType("text/html");
        test.setBackground(Color.yellow);
     
        String str = "<p align='center'><font size='14' color='blue' style='background-color: gray;'>Style Test Result</font></p><br/>"+
                    "<font size='8' color='red' style='background-color:green;'>the first line</font><br/>"+
                    "the second line<br/>";
     
        //get the HTMLEditorKit
        HTMLDocument doc = (HTMLDocument)test.getDocument();
        HTMLEditorKit editorKit = (HTMLEditorKit)test.getEditorKit();
        try{
            //insert the text using the HTMLEditorKit
            editorKit.insertHTML(doc, doc.getLength(), str,0,0, null);
        }catch(BadLocationException ble){
            ble.printStackTrace(System.out);
        } catch(IOException ioe){
            ioe.printStackTrace(System.out);
        }
     
        JFrame f = new JFrame("Style Test");
        f.setContentPane(new JScrollPane(test));
        f.setSize(500, 300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}

           Previous <

References

1. Setting text styles, colors, font and alignment in JTextPane (1): attributes

-------------------------------------------------------------------------------------------------------------------

                        
If you have ever asked yourself these questions, this is the book for you. What is the meaning of life? Why do people suffer? What is in control of my life? Why is life the way it is? How can I stop suffering and be happy? How can I have a successful life? How can I have a life I like to have? How can I be the person I like to be? How can I be wiser and smarter? How can I have good and harmonious relations with others? Why do people meditate to achieve enlightenment? What is the true meaning of spiritual practice? Why all beings are one? Read the book free here.

Thursday, May 29, 2014

Setting text styles, colors, font and alignment in JTextPane (1): attributes

JTextPane allows to set font, styles, foreground color, background color, and text alignment for each segment of  the text, which is very difficult to do with JTextArea. Following is a sample code for setting some of this characters in JTextPane.

import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

public class AttributeTest extends JTextPane {
    SimpleAttributeSet attributeSet;
 
    public AttributeTest() {
        //create the SimpleAttributeSet
        attributeSet = new SimpleAttributeSet();
    }
 
    public void addString(int fontSize,
            Color foregroundColor,
            Color backgroundColor,
            boolean isBold,
            boolean isItalic,
            int alignment,
            String str) {
        //add the attributes to the SimpleAttributeSet
        StyleConstants.setFontSize(attributeSet, fontSize);
        StyleConstants.setForeground(attributeSet, foregroundColor);
        StyleConstants.setBackground(attributeSet, backgroundColor);
        StyleConstants.setBold(attributeSet, isBold);
        StyleConstants.setItalic(attributeSet, isItalic);
        StyleConstants.setAlignment(attributeSet, alignment);
     
        //set the attribute to the StyledDocument
        int len = this.getText().length();    
        StyledDocument sDoc = this.getStyledDocument();
        sDoc.setCharacterAttributes(len, str.length(), attributeSet, false);

        // Or using the following two lines of code to replace the above two lines of code
       // this.setCaretPosition(len);
      //  this.setCharacterAttributes(attributeSet, false);
   
       //insert the string to the JTextPane
        this.replaceSelection(str);
    }
 
    public static void main(String[] args){
        String[] strs = {"The Third Line\n",
                         "The Second Line\n",
                         "The First Line\n",
                         "Style Test Result\n"
                         };
        AttributeTest test = new AttributeTest();
        for (int i=0; i<strs.length; i++) {
            if (i == 3){
                test.addString(14, Color.blue, Color.LIGHT_GRAY, true, false, StyleConstants.ALIGN_CENTER, strs[i]);
            } else if (i == 2){
                test.addString(11, Color.red, Color.GREEN, false, true, StyleConstants.ALIGN_LEFT, strs[i]);
            } else if (i == 1) {
                test.addString(11, Color.orange, Color.LIGHT_GRAY, false, false, StyleConstants.ALIGN_LEFT, strs[i]);
            } else {
                test.addString(11, Color.black, Color.CYAN, false, false, StyleConstants.ALIGN_LEFT, strs[i]);
            }
        }
        test.setBackground(Color.yellow);
        JFrame f = new JFrame("Style Test");
        f.setContentPane(new JScrollPane(test));
        f.setSize(500, 300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}

                                                    > next

References

1. Setting text styles, colors, font and alignment in JTextPane (2): html

-------------------------------------------------------------------------------------------------------------------

                        
If you have ever asked yourself these questions, this is the book for you. What is the meaning of life? Why do people suffer? What is in control of my life? Why is life the way it is? How can I stop suffering and be happy? How can I have a successful life? How can I have a life I like to have? How can I be the person I like to be? How can I be wiser and smarter? How can I have good and harmonious relations with others? Why do people meditate to achieve enlightenment? What is the true meaning of spiritual practice? Why all beings are one? Order Here