2

私はJavaにかなり慣れていませんが、プログラムの他の部分で、、およびを正常に使用していますがJPanelsJButtonsいくつJLabelsかの、、およびその内部をペイントされた背景の上に配置JTextFieldsしようとすると問題が発生します。JPanelJButtonsJLabelsJTextFields

プログラムのこの部分に関連するすべてのコードを次に示します。現在、プログラムを実行すると、背景の、、、およびオーバートップのみが表示されます(プレーヤー2用に作成されたコンポーネントがありますが、集中できるように意図的にコメントを追加p1_fireButtonplayer1PowerFieldました。 player1AngleFieldp2_Panelp1_Panel

奇妙なことにJComponents 、何らかの理由でプログラムの実行後にTabキーを押した場合にのみ表示されます。これは、誰かが修正を手伝ってくれることも期待しています。私の目標はp1_panel、左側のオレンジ色のボックスをp2_panel占有し、右側のオレンジ色のボックスを占有することです。助けていただければ幸いです!

ここに画像の説明を入力してください

public class GameFrame extends JFrame
{ //start class GameFrame

    ImageIcon background = new ImageIcon("background.jpg");
    ImageIcon terrain1 = new ImageIcon("terrain1.png");
    //ImageIcon tank_red = new ImageIcon("tank_red.png");
    //ImageIcon tank_red = new ImageIcon(player1Tank);

    private int x_rectangle = 50;
    private int y_rectangle = 50;

    private JButton p1_fireButton;
    private JButton p2_fireButton;
    private JPanel p1_Panel;
    private JPanel p2_Panel;

    private JLabel player1PowerLabel;
    private static JTextField player1PowerField;
    private JLabel player1AngleLabel;
    private static JTextField player1AngleField;

    private JLabel player2PowerLabel;
    private static JTextField player2PowerField;
    private JLabel player2AngleLabel;
    private static JTextField player2AngleField;

    String player1Name;
    String player2Name;
    final Timer gameTimer = new Timer(8, new timer());

    Projectile projectile = new Projectile(200, 300);

    public GameFrame(String title)
    { //start GameFrame constructor
        super(title);
        Dimension size = getPreferredSize();
        size.width = 1000;
        setPreferredSize(size);
        setResizable(false);
        setLayout(null);
        Color trans = new Color(0, 0, 0, 0);

        //player1 panel
        p1_Panel = new JPanel();
        p1_Panel.setLayout(null);
        p1_Panel.setBounds(0, 0, 500, 300);
        p1_Panel.setBackground(trans);

        p2_Panel = new JPanel();
        p2_Panel.setLayout(null);
        p2_Panel.setBounds(500, 0, 500, 300);
        p2_Panel.setBackground(trans);

        //player2 panel
        /*p2_fireButtonPanel = new JPanel();
        p2_fireButtonPanel.setBounds(400, 85, 100, 100);
        p2_fireButtonPanel.setBackground(trans);*/

        //player1 angle/power fields
        player1PowerLabel = new JLabel("Power");
        player1PowerLabel.setLayout(null);
        player1PowerLabel.setBounds(400, 20, 50, 50);

        player1PowerField = new JTextField(3);
        player1PowerField.setLayout(null);
        player1PowerField.setBounds(400, 10, 50, 25);

        player1AngleLabel = new JLabel("Angle");
        player1AngleLabel.setLayout(null);
        player1AngleLabel.setBounds(30, 10, 50, 50);

        player1AngleField = new JTextField(3);
        player1AngleField.setLayout(null);
        player1AngleField.setBounds(300, 10, 50, 25);


        //player2 angle/power fields
        player2PowerLabel = new JLabel("Power");
        player2PowerLabel.setLayout(null);
        player2PowerLabel.setBounds(0, 0, 10, 10);

        player2PowerField = new JTextField(3);
        player2PowerField.setLayout(null);
        player2PowerField.setBounds(10, 10, 10, 10);

        player2AngleLabel = new JLabel("Angle");
        player2AngleLabel.setLayout(null);
        player2AngleLabel.setBounds(30, 10, 10, 10);

        player2AngleField = new JTextField(3);
        player2AngleField.setLayout(null);
        player2AngleField.setBounds(60, 10, 10, 10);


        //player1 fire button
        p1_fireButton = new JButton("Fire!");
        p1_fireButton.setLayout(null);
        p1_fireButton.setBounds(430, 70, 50, 50);
        ActionListener fireListener = new fireButtonListener();
        p1_fireButton.addActionListener(fireListener);

        //player2 fire button
        p2_fireButton = new JButton("Fire AGAIN!");
        p2_fireButton.setLayout(null);
        p2_fireButton.setBounds(530, 70, 50, 50);


        //add components to player1 panel
        p1_Panel.add(p1_fireButton);
        p1_Panel.add(player1PowerLabel);
        p1_Panel.add(player1PowerField);
        p1_Panel.add(player1AngleLabel);
        p1_Panel.add(player1AngleField);

        //add components to player2 panel
        p2_Panel.add(p2_fireButton);
        p2_Panel.add(player2PowerLabel);
        p2_Panel.add(player2PowerField);
        p2_Panel.add(player2AngleLabel);
        p2_Panel.add(player2AngleField);

        //add components to GameFrame
        add(p1_Panel);
        //add(p2_Panel);

        projectile.fireProjectile(60, -60 * Math.PI / 180.0);

    } //end GameFrame constructor

    public void paint(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;

        Image bg = background.getImage();
        Image t1 = terrain1.getImage();
        Image p1tank = StartPanel.getPlayer1Tank();
        Image p2tank = StartPanel.getPlayer2Tank();
        //Image tank1 = tank_red.getImage();

        g2.drawImage(bg,  0, 0, 1000, 800, this);
        g2.drawImage(t1,  0, 420, 1000, 380, this);


        g2.drawImage(p1tank, 50, 300, 66, 50, null);
        g2.drawImage(p2tank, 500, 300, 66, 50, null);

        player1Name = new String(StartPanel.getPlayer1Name());
        player2Name = new String(StartPanel.getPlayer2Name());

        g.drawString(player1Name, 50, 50);
        g.drawString(player2Name, 525, 50);

        g2.setColor(Color.green);
        g2.fillOval((int)projectile.getXPosition(), (int)projectile.getYPosition(), 15, 15);


    }

    public class timer implements ActionListener
    {

        public void actionPerformed(ActionEvent e)
        {    
            //TanksGUI.gameFrame.moveRectangle(1, 1);
            projectile.advanceProjectile(0.05);

            if (projectile.getYPosition() > 400)
            {
                gameTimer.stop();
            }
            repaint();

        }

    }
    public class fireButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {

            gameTimer.start();
        }
    }


} //end class GameFrame
4

2 に答える 2

2

これを支援するためにBackgroundPanelをチェックしてください。基本的なコードは次のとおりです。

JPanel north = new JPanel();
north.add( new JLabel(...) );
north.add( new JTextField(10) );
JPanel gamePanel = new GamePanel();
BackgroundPanel background = new BackgroundPanel(...);
background.add(north, BorderLayout.North);
background.add(gamePanel);
frame.add(background);

GamePanelは、ゲームキャラクターのすべてのカスタムペイントを行うパネルです。MadProgrammerが指摘しているように、このペイントはフレームのpaint()メソッドで実行しないでください。

于 2013-03-06T03:42:44.460 に答える
2
  • JFrameインスタンスの作成では達成できなかった機能を追加していないことから拡張しないでください。また、プロジェクトを移植できなくなります。
  • paintトップレベルのコンテナを上書きしないでください。他の理由がない場合、それらはダブルバッファリングされません。これにより、アニメーションを実行する場合に問題が発生します。トップレベルコンテナのpaintチェーンはかなり複雑で、プロセス全体を回避しただけです。
  • 代わりに、(のようなものからJPanel)カスタムコンポーネントを作成し、それをプライマリキャンバスとして使用します。そのメソッドをオーバーライドしpaintComponent、背景をレンダリングして、super.paintComponent最初に呼び出すようにします。
  • この「キャンバス」に配置するコンテナが透明であることを確認してください。透明でない場合、背景が表示されません。

詳細については、AWTおよびSwingでのカスタムペイントとペイントの実行を参照してください。

于 2013-03-06T02:50:38.730 に答える