-1

プログラムを実行すると、画面上のカードを変更する必要があるボタンがマウスオーバーされるまで表示されないことを除いて、すべてが計画どおりに機能します。これは、画像を保持しているコンテナがその上にあるためだと思いますが、それを背景に移動する方法や、画像を追加するために使用できるコンテナの種類さえわかりません。

import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.util.Random;
import java.awt.event.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;

public class oneplayer extends JFrame {
    BufferedImage  image1, image2, image3, image4;
    Random gen = new Random();
    public void redo() {
        int p1, p2, p3, p4;
        p1 = gen.nextInt(13) + 1;
        p2 = gen.nextInt(13) + 14;
        p3 = gen.nextInt(13) + 27;
        p4 = gen.nextInt(13) + 40;
         try {
         File input1 = new File("C:/Users/Mike/Desktop/eclipse/workspace/inClass/src/" + p1 + ".png");
         File input2 = new File("C:/Users/Mike/Desktop/eclipse/workspace/inClass/src/" + p2 + ".png");
         File input3 = new File("C:/Users/Mike/Desktop/eclipse/workspace/inClass/src/" + p3 + ".png");
         File input4 = new File("C:/Users/Mike/Desktop/eclipse/workspace/inClass/src/" + p4 + ".png");
         image1 = ImageIO.read(input1);
         image2 = ImageIO.read(input2);
         image3 = ImageIO.read(input3);
         image4 = ImageIO.read(input4);
     } catch (IOException ie) {
         System.out.println("Error:"+ie.getMessage());
     }
     repaint();
}

public oneplayer() {
    JPanel buttonPanel = new JPanel();
    setLayout(new BorderLayout());
    JButton refresh = new JButton("Refresh");
    refresh.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            redo();
        }
    });
    add(buttonPanel, BorderLayout.SOUTH);
    buttonPanel.add(refresh, BorderLayout.CENTER);
    redo();
}

public void paint(Graphics g) {
     g.drawImage(image1, 20, 55, null);
     g.drawImage(image2, 96, 55, null);
     g.drawImage(image3, 172, 55, null);
     g.drawImage(image4, 248, 55, null);
}

public static void main(String args[]) {
    oneplayer frame = new oneplayer();
    frame.setTitle("Random Cards");
    frame.setSize(350, 200);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}
}
4

3 に答える 3

4

paint()メソッドをオーバーライドしないでください。代わりpaintComponent()に、メイン コンテナーをオーバーライドします。

電話super.paintComponent(g)

拡張しないでください。JFrameたとえばJPanel、すべてのコンテンツをパネルに追加し、パネルを通常のJFrameインスタンスのコンテンツ ペインとして設定します。

于 2013-02-08T13:53:40.990 に答える
0

サンプルでこれをテストしていませんが、フレームのコンポーネントを表示するには、フレームのペイントをオーバーライドするときに親クラスのペイントを呼び出す必要があると思います。そのようです:

public void paint(Graphics g) {
     super.paint(g);
     g.drawImage(image1, 20, 55, null);
     g.drawImage(image2, 96, 55, null);
     g.drawImage(image3, 172, 55, null);
     g.drawImage(image4, 248, 55, null);
}
于 2013-02-08T13:53:25.810 に答える
0

フレーム内の Swing コンポーネントが正しく表示されるようにするにはsuper.paint(g)、関数内で呼び出す必要があります。paint(Graphics)

于 2013-02-08T13:53:07.937 に答える