2016-03-31 34 views
0

Tamam, Bu yüzden bir JPanel üzerinde bir String görüntüleyen bir programım var ve Ascents'ın olduğu çizgileri çiziyor, inişte bir çizgi çiziyor ve aralarında bir çeyrek yol var. Yazı tipini ve String'in boyutunu değiştirmek için bir açılan kutum var ve Metni kendisi değiştirmek için bir JTextField var. String'i güncellemek için actionListeners kullandım. String'in metnini JTextField aracılığıyla güncellersek, program parlar ve JFrame'in sağ üst köşesinde JTextField görüntüsünün bir kopyasını gösterir.JTextFild Glitched Out

Kodu:

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()); 

    } 
    } 
} 

cevap

2

sizin paintComponent yöntemle

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

Temelde, paintComponent görevlerinden biri de şimdiki bileşenini boyama için Graphics bağlamını hazırlamak başlangıcına super.paintComponent(g) ekleyin. Salıncak olarak, Graphics boyanmış zaman aralığı içindeki tüm bileşenleri tarafından kullanılan bir paylaşılan kaynak, yani Performing Custom Painting ve Painting in AWT and Swing bir göz atın

üzerine boya önce bu bağlam düzgün hazırlıklı olmak önemlidir boyamanın nasıl çalıştığı hakkında daha fazla bilgi için

+0

Wow, bunu yapmayı kesinlikle unuttum. Yardım ettiğin için teşekkür ederim! –