0

配列をグラフィカルに表示しようとしていますが、問題があります。

配列を埋める前に「null」を実行しても問題ありませんが、配列を埋めた後は「null」を上書きして読みにくくなります。

配列がいっぱいになった後、キャンバスがクリアされて再描画されるようにするにはどうすればよいですか。

これまでの私のコードは次のとおりです。

public class wordManager extends JFrame
{
String[] array = new String[15];

private BufferedImage buffered;
public wordManager()
{
    super("Word Managery");


    setSize(300,600);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

 public void paint(Graphics window)
 {
     if(buffered==null)
            buffered = (BufferedImage)(createImage(getWidth(),getHeight()));

     Graphics windowTemp = buffered.createGraphics();

     int y = 50;
     for(int i = 0; i<array.length; i++)
     {
        windowTemp.drawString(array[i] + "", 10,y);
        y+=10;

     }

     window.drawImage(buffered, 0, 0, null);
 }


public void read(String filename) throws IOException
{

    String word;
    int i = 0;
    Scanner file = new Scanner(new File(filename+".txt"));
    while(file.hasNext())
    {
        word = file.next();
        array[i] = word;

        i++;
    }
    repaint();
}


public void scramble()
{
    for(int i=0;i<array.length;i++)
    {
        int a = (int) (Math.random()*array.length);
        String b = array[i];
        array[i] = array[a];
        array[a] = b;
    }
    repaint();
}

public void sort() 
{
    for (int i = 1; i < array.length; i++)
    {
        int s = i-1;
        for (int j = i; j < array.length; j++)
        {
            if (array[j].compareTo(array[s]) < 0)
            {
                 s = j;
            }
        }
         String temp = array[i-1];
         array[i-1] = array[s];
         array[s] = temp;
    }
    repaint();
}


public void write() throws IOException
{
    PrintWriter fileOut = new PrintWriter(new FileWriter("out.txt"));

    for(int i = 0; i<array.length; i++)
    {
        fileOut.println(array[i]);  
    }

    fileOut.close();

}

public void printArray()
{
    for(String term : array)
    {
        System.out.println(term);
    }
}

}

public class runner
{
public static void main(String args[]) throws IOException 
{
    wordManager run = new wordManager();

    Scanner keyboard = new Scanner(System.in);
    System.out.println("In put file name");
    String filename = keyboard.next();

    run.read(filename);

    System.out.println("");
    run.printArray();
    System.out.println("");

    System.out.println("Enter 1 if you want to sort\n");
    System.out.println("Enter 2 if you want to scramble");


    int selection = keyboard.nextInt();


        if(selection == 1)
        {
            run.sort();
        }

        if(selection == 2)
        {
            run.scramble();
        }

    run.printArray();
    System.out.println("");

    run.write();
}
}
4

2 に答える 2

1

ペイント チェーンを尊重できませんでした。

ペイントは多くの重要な作業を行いますが、最も注目すべきは、グラフィックスをレンダリングする準備をすることです。

Graphicsは共有リソースであるため、再描画マネージャーが再描画する必要があるすべてのコンポーネントを通過できます。ペイント プロセスの一部として、通常は を呼び出してグラフィックスをクリアしsuper.paintます。

さて、そうは言っても。ごくまれに、トップ レベル コンテナのメソッドをオーバーライドする必要がありますpaint。トップ レベル コンテナがダブル バッファリングされていない場合です。

代わりに、のようなものからカスタム コンポーネントを作成し、そのメソッドJPanelをオーバーライドする必要がありますpaintComponent

グラフィック環境のテキストには、現在のフォントに基づくメトリックがあります。テキストが表示される次の行を計算するために単純にマジック ナンバーを使用すると、フォントが変更されたときに多くの厄介な結果が生成されます (実際に変更されます)。

ここに画像の説明を入力

代わりに、次のようなことをする必要があります...

FontMetrics fm = windowTemp.getFontMetrics();
int y = 50;
for(int i = 0; i<array.length; i++)
{
    windowTemp.drawString(array[i] + "", 10,y + fm.getAscent());
    y+=fm.getHeight();
}

テキスト APIの操作をご覧ください。

于 2013-02-11T04:23:44.240 に答える
1

JFrame (またはその他の最上位ウィンドウ) の paint() メソッドをオーバーライドしないでください。

カスタム ペイントは、JPanel の paintComponent() メソッドをオーバーライドすることによって行われ、その後、パネルをフレームに追加します。

また、メソッドの最初のステートメントとして super.paintComponent(...) を呼び出して、背景が確実にクリアされるようにすることを忘れないでください。

詳細については、カスタム ペインティングに関する Swing チュートリアルを参照してください。

おそらく、より簡単な解決策は、テキストを JTextArea に表示することです。そうすれば、三輪車を再発明する必要がなくなります。

于 2013-02-11T04:19:51.107 に答える