Java 为什么我的Swing应用程序显示不正确?

Java 为什么我的Swing应用程序显示不正确?,java,swing,jpanel,paint,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.BO

我正在尝试开发一款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);
  }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类Demo_字体扩展JPanel
{
静态字符串[]字体类型;
//int[]style={Font.PLAIN、Font.ITALIC、Font.BOLD、Font.ITALIC+Font.BOLD};
int[]style={Font.PLAIN};
字符串[]样式名={“普通”、“斜体”、“粗体”、“粗体和斜体”};
演示字体()
{
设置首选尺寸(新尺寸(5003000));
}
公共空间涂料(图g)
{

对于(int f=0;f您的第一行绘制可能应该是
super.paint(g)
。父级
paint()
方法将清除面板

向下滚动时,将在组件上再次绘制。如果不清除已绘制的内容,将继续在其他内容上绘制,导致混乱

编辑:我添加了这一行,现在它可以在我的计算机上运行了

编辑:正如mKorbel所建议的,您应该真正覆盖
paintComponent
而不是
paint
paint
更适合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);
      }
    }
  }
@覆盖
公共组件(图形g)
{
超级组件(g);

对于(int f=0;f您的第一行绘制可能应该是
super.paint(g)
。父级
paint()
方法将清除面板

向下滚动时,将在组件上再次绘制。如果不清除已绘制的内容,将继续在其他内容上绘制,导致混乱

编辑:我添加了这一行,现在它可以在我的计算机上运行了

编辑:正如mKorbel所建议的,您应该真正覆盖
paintComponent
而不是
paint
paint
更适合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);
      }
    }
  }
@覆盖
公共组件(图形g)
{
超级组件(g);

对于(int f=0;f您的第一行绘制可能应该是
super.paint(g)
。父级
paint()
方法将清除面板

向下滚动时,将在组件上再次绘制。如果不清除已绘制的内容,将继续在其他内容上绘制,导致混乱

编辑:我添加了这一行,现在它可以在我的计算机上运行了

编辑:正如mKorbel所建议的,您应该真正覆盖
paintComponent
而不是
paint
paint
更适合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);
      }
    }
  }
@覆盖
公共组件(图形g)
{
超级组件(g);

对于(int f=0;f您的第一行绘制可能应该是
super.paint(g)
。父级
paint()
方法将清除面板

向下滚动时,将在组件上再次绘制。如果不清除已绘制的内容,将继续在其他内容上绘制,导致混乱

编辑:我添加了这一行,现在它可以在我的计算机上运行了

编辑:正如mKorbel所建议的,您应该真正覆盖
paintComponent
而不是
paint
paint
更适合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);
      }
    }
  }
@覆盖
公共组件(图形g)
{
超级组件(g);

对于(int f=0;fJPanel+paintComponent,paintComponent+super.paintComponent作为第一行代码,通过替换f.setSize(6001400)覆盖getPreferredSize而不是setPreferredSize,f.pack();可能比绘画更好,使用类似“显示所有可用字体并向我展示它们的外观”这样的内容提示:使用列表或!JPanel+paintComponent,paintComponent+super.paintComponent作为第一行代码,通过替换f.setSize(6001400)覆盖getPreferredSize而不是setPreferredSize,f.pack();可能比绘画更好,使用类似“显示所有可用字体并向我展示它们的外观”提示:使用列表或!JPanel+paintComponent,paintComponent+super.paintComponent作为第一行代码,通过替换f.setSize(6001400)覆盖getPreferredSize而不是setPreferredSize,f.pack();可能比绘画更好,使用类似“显示所有可用字体并向我展示它们的外观”提示:使用列表或!JPanel+paintComponent,paintComponent+super.paintComponent作为第一行代码,通过替换f.setSize(6001400)覆盖getPreferredSize而不是setPreferredSize,f.pack();可能比绘画更好,使用类似“显示所有可用字体并向我展示它们的外观”提示:使用列表或!请将油漆更改为油漆组件,然后非常好answer@mKorbel我把它作为一个建议放进去了。请把油漆换成油漆组件,这样很好answer@mKorbel我把它作为一个建议放进去了。请把油漆换成油漆组件,这样很好answer@mKorbel我把它作为一个建议提了进去.请把油漆换成油漆组件,这样就很好了answer@mKorbel我把它作为一个建议提了进去。