2016-03-31 7 views
0

OK、JPanelに文字列を表示し、Ascentsがどこにあるかを示す線を描画し、降下中と途中と四分の一の間に線を描画します。私は文字列のフォントとサイズを変更するためのコンボボックスを持っており、テキスト自体を変更するJTextFieldがあります。私は、Stringを更新するためにactionListenersを使用しました。 JTextFieldを介してStringのテキストを更新すると、プログラムが異常終了し、JFrameの右上にJTextFieldのイメージのコピーが表示されます。JTextFild Glockched Out

コード:

package com.Patel.RichClients; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.GraphicsEnvironment; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 

//a class to demonstrate 
public class StringAscent extends JFrame { 
    private static Font font; 
    private int fontSize = 50; 
    private StringPanel panel; 
    private JComboBox fontOptions; 
    private JComboBox fontSizeOptions; 
    private JTextField text; 


    // constructor 
    public StringAscent() { 
    // set the initial font to Times new Roman 
    font = new Font("Agency FB", Font.PLAIN, fontSize); 
    setVisible(true); 
    setSize(520, 170); 
    setTitle("String Ascents"); 
    setLayout(new BorderLayout()); 

    //set up the components 
    GraphicsEnvironment ge= GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    String[] fontNames = ge.getAvailableFontFamilyNames(); 
    fontOptions = new JComboBox(fontNames); 
    text = new JTextField(22); 
    text.setText("Swing"); 
    String[] sizeOptions = new String[50]; 
    for (int i = 0; i < sizeOptions.length; i ++){ 
     sizeOptions[i] = Integer.toString(i + 1); 
    } 
    fontSizeOptions = new JComboBox(sizeOptions); 
    panel = new StringPanel(); 

    //set up actionListeners 
    fontOptions.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
     JComboBox ref = (JComboBox) e.getSource(); 
     font = new Font(fontNames[ref.getSelectedIndex()], Font.PLAIN, fontSize); 
     panel.repaint(); 
     }  
    }); 
    fontSizeOptions.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
     JComboBox ref = (JComboBox) e.getSource(); 
     fontSize = Integer.parseInt(sizeOptions[ref.getSelectedIndex()]); 
     font = new Font(font.getName(), Font.PLAIN, fontSize); 
     panel.repaint(); 
     }  
    }); 
    text.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
     panel.repaint(); 
     } 

    }); 

    //add components 
    add(panel, BorderLayout.NORTH); 
    add(fontOptions, BorderLayout.WEST); 
    add(text, BorderLayout.CENTER); 
    add(fontSizeOptions, BorderLayout.EAST); 
    } 


    public static void main(String[] args) { 
    Runnable showGui = new Runnable() { 
     public void run() { 
     StringAscent gui = new StringAscent(); 
     } 
    }; 
    SwingUtilities.invokeLater(showGui); 
    } 

    // inner JPanel class 
    private class StringPanel extends JPanel { 

    // constructor 
    public StringPanel() { 

    } 

    public Dimension getPreferredSize() { 
     return new Dimension(400, 100); 
    } 

    public void paintComponent(Graphics g) { 
     g.setColor(Color.black); 

     // set up the string 
     g.setFont(font); 
     // FontMetric is an object that holds information relevant to the 
     // rendering of the font 
     FontMetrics metric = g.getFontMetrics(); 
     int ascent = metric.getAscent(); 
     String string = text.getText(); 
     g.drawString(string, 100, 50); 

     int x = 50; 
     // draw Ascent line 
     g.drawLine(x, 50 - ascent, x + 180, 50 - ascent); 

     // draw Ascent/2 line 
     g.drawLine(x, 50 - (ascent/2), x + 180, 50 - (ascent/2)); 

     // draw Ascent/4 line 
     g.drawLine(x, 50 - (ascent/4), x + 180, 50 - (ascent/4)); 

     // draw baseline line 
     g.drawLine(x, 50, x + 180, 50); 

     // draw Descent line 
     g.drawLine(x, 50 + metric.getDescent(), x + 180, 50 + metric.getDescent()); 

    } 
    } 
} 

答えて

2

あなたpaintComponent方法

public void paintComponent(Graphics g) { 
    super.paintComponent(g) 
    g.setColor(Color.black); 
    //... 

の開始にsuper.paintComponent(g)を追加し、基本的に、paintComponentの仕事の一つは、現在のコンポーネントを描くためGraphicsコンテキストを準備することです。スイングでは、Graphicsは塗装されたときに、ウィンドウ内のすべてのコンポーネントで使用される共有リソースがあるので、あなたはPerforming Custom PaintingPainting in AWT and Swingを見てみましょう

それにペイントする前に、そのコンテキストが適切に準備されていることを確認することが重要です絵画の仕組みの詳細については

+0

うわー、私はそれを完全に忘れてしまった。ご協力いただきありがとうございます! –