为什么我的Swing应用程序无法正常显示?

时间:2015-05-25 15:49:59

标签: java swing jpanel paint

我正在尝试使用可以显示所有可用字体的Swing应用程序,并向我展示它们的外观:

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

public class Demo_Fonts extends JPanel
{
  static String[] font_type;
//  int[] styles={Font.PLAIN,Font.ITALIC,Font.BOLD,Font.ITALIC+Font.BOLD};
  int[] styles={Font.PLAIN};
  String[] stylenames={"Plain","Italic","Bold","Bold & Italic"};

  Demo_Fonts()
  {
    setPreferredSize(new Dimension(500,3000));
  }

  public void paint(Graphics g)
  {
    for (int f=0;f<font_type.length;f++)
    {
      for (int s=0;s<styles.length;s++)
      {
        Font font=new Font(font_type[f],styles[s],18);
        g.setFont(font);
        String name=font_type[f]+" "+stylenames[s];
//        g.drawString(name,20,(f*4+s+1)*20);
        g.drawString(name,20,(f+s+1)*20);
      }
    }
  }

  public static void main(String[] a)
  {
    font_type=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
    for (int i=0;i<font_type.length;i++) System.out.println(font_type[i]);

    JFrame f=new JFrame();
    f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });

    JScrollPane areaScrollPane=new JScrollPane(new Demo_Fonts());
    areaScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    areaScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
//    areaScrollPane.setMinimumSize(new java.awt.Dimension(600,500));
    areaScrollPane.setPreferredSize(new Dimension(500,1400));
    f.setContentPane(areaScrollPane);
    f.setSize(600,1400);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}

但是当我向下滚动时,内容全部搞砸了,为什么以及如何修复?

1 个答案:

答案 0 :(得分:3)

可能你的第一道油漆应该是super.paint(g)。父paint()方法将清除该面板。

向下滚动时,再次在组件上paint。如果你不清楚你已经绘制过的东西,你只会继续绘制其他东西,导致一团糟。

编辑:我添加了这一行,它现在可以在我的电脑上运行。

编辑:正如mKorbel建议的那样,你应该覆盖paintComponent而不是paintpaint更适合AWT,但它对您的程序“有效”。如果您使用Java Swing,通常会覆盖paintComponent。实际上,您应该删除paint方法并将其替换为

  @Override
  public void paintComponent(Graphics g)
  {
      super.paintComponent( g );
    for (int f=0;f<font_type.length;f++)
    {
      for (int s=0;s<styles.length;s++)
      {
        Font font=new Font(font_type[f],styles[s],18);
        g.setFont(font);
        String name=font_type[f]+" "+stylenames[s];
//        g.drawString(name,20,(f*4+s+1)*20);
        g.drawString(name,20,(f+s+1)*20);
      }
    }
  }