1

paintComponent(Graphics g)for ループを使用していくつかの画像をペイントするために使用したいと考えています。ただし、JFrame は白い画面として表示されるだけで、ウィンドウのサイズを変更した後は黒い背景と画像のみが表示されます。

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*;
import java.io.*; 
import javax.imageio.*; 
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.awt.Graphics;
import java.util.Scanner;

 public class SimpleAdventure {
         private JFrame frame;
         private CardLayout cards;
         private Container c;
         private DrawPanel1 gamepanel;
         private BufferedImage greentiles, pinktiles, sandtiles, charsprites;
         private Image left1, right1, left2, right2, front;
         private Image pinkbg, greenbg, sandbg;
         private Image pinktop, greentop, sandtop;
         private int charx, chary;

         public SimpleAdventure()
         {}
         public static void main (String [] args)
         {
                 SimpleAdventure retro = new SimpleAdventure();
                 retro.run();
         }
         public void run()
         {
                 frame = new JFrame("Simple Adventure");
                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                 frame.setSize(576, 576);
                 frame.setVisible(true);
                 // frame.setResizable(false);
                 getImage();


                 c = frame.getContentPane();
                 cards = new CardLayout();
                 c.setLayout(cards);

                 gamepanel = new DrawPanel1();
                 gamepanel.setBackground(Color.black);
                 c.add(gamepanel, "Panel 1");
         }
         public void getImage()
         {

             try
             {
                 greentiles = ImageIO.read(new File("greenTiles.png"));
                 pinktiles = ImageIO.read(new File("pinkTiles.png"));
                 sandtiles = ImageIO.read(new File("sandTiles.png"));
                 charsprites = ImageIO.read(new File("charactersheet.png"));
             }
             catch(IOException e)
             {
                 e.printStackTrace();
             }


             left1 = charsprites.getSubimage(18, 0, 6, 6);
             left2 = charsprites.getSubimage(24, 0, 6, 6);
             right1 = charsprites.getSubimage(0, 0, 6, 6);
             right2 = charsprites.getSubimage(6, 0, 6, 6);
             front = charsprites.getSubimage(12, 0, 6, 6);

             greenbg = greentiles.getSubimage(240, 0, 16, 16);
             sandbg = sandtiles.getSubimage(240, 0, 16, 16);
             pinkbg = pinktiles.getSubimage(240, 0, 16, 16);

             greentop = greentiles.getSubimage(224, 0, 16, 16);
             sandtop = sandtiles.getSubimage(224, 0, 16, 16);
             pinktop = pinktiles.getSubimage(224, 0, 16, 16);
         }

         class DrawPanel1 extends JPanel implements KeyListener
         {
                 // private BottomPanel lower;
                 public DrawPanel1()
                 {
                     /*this.setLayout(new BorderLayout());
                     lower = new BottomPanel();
                     this.add(lower, BorderLayout.SOUTH);*/
                     addKeyListener(this);
                 }

                 public void paintComponent(Graphics g)
                 {
                         super.paintComponent(g);

                         for(int i = 0; i < 7; i++)
                         {
                             g.drawImage(greentop, 0 + (i * 96), 480, 96, 96, this);
                         }
                         System.out.println("check");
                 }
                 public void keyPressed(KeyEvent e)
                 {

                 }
                 public void keyReleased(KeyEvent e)
                 {

                 }
                 public void keyTyped(KeyEvent e)
                 {

                 }
         } }
4

2 に答える 2

5

frame.pack()初期レイアウトを行うには、呼び出す必要があります。ウィンドウのサイズを変更すると、レイアウトは自動的に固定されますが、固定されframe.setSize(...)ません*。

frame.setVisible(true)メソッドの最後(つまり、すべての UI 要素を作成した後) に移動し、 の直前にrun置きます。(これを指摘してくれた Hovercraft と MadProgrammer に感謝します)frame.pack()frame.setVisible(true)

※少なくとも、フレームが見えない場合はそうではありません。フレームが既に表示されている場合は機能する可能性があります。試してみてください。

編集: Javadoc を読み直したので、おそらくpack結局は必要ないでしょう。フレームのサイズが変更されます。setVisibleそれをテストせずに、最後に移動するとうまくいくと思います。そうでない場合は、レイアウト エンジンを実行するのではrevalidateなく使用します。pack

編集 2: javadoc を読み直したsetVisibleので、まだ表示可能でない場合はウィンドウを検証します。したがって、を明示的に呼び出す必要はありませんrevalidatesetSizeコンポーネントを無効にしますが、再有効化はしません。

TL;DR: 検証と表示可能性が Swing でどのように機能するかを読む価値はあります。そうすれば、私が犯した過ちを犯すことはありません。

于 2013-06-06T04:00:42.057 に答える
3

setVisibleUI を作成した後でのみ呼び出す...

public void run()
{
    frame = new JFrame("Simple Adventure");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(576, 576);
    // frame.setResizable(false);
    getImage();


    c = frame.getContentPane();
    cards = new CardLayout();
    c.setLayout(cards);

    gamepanel = new DrawPanel1();
    gamepanel.setBackground(Color.black);
    c.add(gamepanel, "Panel 1");

    // Lucky last...   
    frame.setVisible(true);
}

それ以外の場合は、フレームを再検証する必要があります

于 2013-06-06T04:00:22.317 に答える