Swing missing smooth fonts in Linux

S

Steve Horsley

I can't seem to get smooth fonts using Swing on Linux (Sun java 1.4 on
Mandrake 9.2). I figured out how to make antialiasing happen, but all my
favourite fonts are missing from the list of available fonts (e.g.
Bitstream vera sans).

I suspect it may just be that it doesn't do TrueType fonts. Is this
right? Is there a fix?

Please forgive the long post, but here is an example font picker
utility. It doesn't list lots of fonts that OOo does.

Steve


import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;


/**
* @author Steve Horsley
* @version 1
*/
public class FontPicker
extends JPanel
implements ActionListener, ListSelectionListener, ChangeListener
{
private Font[] fonts;
private JList list;
private AAJTextField sampleText;
private JTextField sizeText;
private JToggleButton toggle;
private int size;
private Font selectedFont;
private boolean antiAlias;

private UIDefaults uid = UIManager.getDefaults();

public FontPicker() {
size = 14;
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
fonts = ge.getAllFonts();
Vector v = new Vector();
for(int x = 0 ; x < fonts.length ; x++) {
v.add(fonts[x].getFontName());
}
setLayout(new BorderLayout());
list = new JList(v);
list.addListSelectionListener(this);
add(new JScrollPane(list), BorderLayout.CENTER);
sampleText = new AAJTextField("Sample Text");
add(sampleText, BorderLayout.NORTH);
JPanel sizePanel = new JPanel();
sizePanel.add(new JLabel("Size : "));
sizeText = new JTextField(String.valueOf(size), 4);
sizeText.addActionListener(this);
sizePanel.add(sizeText);
toggle = new JCheckBox("Anti-Alias");
toggle.addChangeListener(this);
sizePanel.add(toggle);
add(sizePanel, BorderLayout.SOUTH);
}

/** Size JTextField event. */
public void actionPerformed(ActionEvent e) {
redisplay();
}

/** JToggleButton event. */
public void stateChanged(ChangeEvent e) {
redisplay();
}

/** JList event. */
public void valueChanged(ListSelectionEvent e) {
if(e.getValueIsAdjusting()) {
return;
}
redisplay();
}


/** Sets the font in the sample text area. */
private void redisplay() {
try {
size = Integer.parseInt(sizeText.getText().trim());
} catch(Exception ex) {
}
sizeText.setText(String.valueOf(size));
int sel = list.getSelectedIndex();
if(sel < 0) {
return;
}
selectedFont = fonts[sel].deriveFont((float)size);
antiAlias = toggle.isSelected();
sampleText.setAntiAlias(antiAlias);
sampleText.setFont(selectedFont);
validate();
repaint();
}

/** Return the selected Font. This is not the base font,
* but the derived font already in the chosen size.
*/
public Font getSelectedFont() {
return sampleText.getFont();
}

/** Return true is anti-alias is selected. */
public boolean getSelectedAntiAlias() {
return toggle.isSelected();
}

/** Return the selected font size.
* This isn't really needed since getSelectedFont already supplies the
* font of the required size.
*/
public int getSelectedSize() {
return size;
}


/** Testing only. */
public static void main(String[] args) {
JFrame frame = new JFrame("Steves Font Picker");
frame.getContentPane().add(new FontPicker());
frame.pack();
frame.setVisible(true);
// Platform look and feel
// try {
// UIManager.setLookAndFeel(
// UIManager.getCrossPlatformLookAndFeelClassName());
// } catch (Exception e) {
// System.out.println(e.toString());
// }
}

/** Override paintComponent in order to set rendering hint */
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
super.paintComponent(g);
}


/** A TextField with configurable antialias rendering hint. */
private class AAJTextField extends JTextField {
private Object hint;

private AAJTextField(String s) {
super(s);
hint = RenderingHints.VALUE_ANTIALIAS_OFF;
}

private void setAntiAlias(boolean b) {
hint = b ? RenderingHints.VALUE_ANTIALIAS_ON
: RenderingHints.VALUE_ANTIALIAS_OFF;
repaint();
}

/** Override paintComponent in order to set rendering hint */
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, hint);
super.paintComponent(g);
}
}
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,020
Latest member
GenesisGai

Latest Threads

Top