سؤال

لقد قمت بإنشاء فصل يمتد JLabel لاستخدامه ككائني يتحرك حول JPanel للعبة.

import javax.swing.*;

public class Head extends JLabel {

 int xpos;
 int ypos;

 int xvel;
 int yvel;

 ImageIcon chickie = new ImageIcon(
        "C:\\Users\\jjpotter.MSDOM1\\Pictures\\clavalle.jpg");
 JLabel myLabel = new JLabel(chickie);

 public Head(int xpos, int ypos, int xvel, int yvel){

  this.xpos = xpos;
  this.ypos = ypos;
  this.xvel = xvel;
  this.yvel = yvel;
 }

 public void draw(){
  myLabel.setLocation(xpos, ypos);
 }

 public double getXpos() {
  return xpos;
 }

 public double getYpos() {
  return ypos;
 }

 public int getXvel() {
  return xvel;
 }

 public int getYvel() {
  return yvel;
 }

 public void setPos(int x, int y){

  xpos = x;
  ypos = y;

 }

}

أحاول بعد ذلك إضافته على jpanel الخاص بي. من هنا ، سأقوم بزيادة إحداثيات X و Y بشكل عشوائي لتطفوها حول الشاشة. لا يمكنني الحصول عليها لطلاء نفسها على jpanel. أعلم أن هناك مفهومًا رئيسيًا أفتقده هنا يتضمن مكونات الطلاء على لوحات مختلفة. إليكم ما لدي في فصل gamepanel الخاص بي

import java.awt.Dimension;
import java.util.Random;
import javax.swing.*;


public class GamePanel extends JPanel {

 Random myRand = new Random();
 Head head = new Head(20,20,0,0);

 public GamePanel(){

  this.setSize(new Dimension(640, 480));
  this.add(head);

 }

}

أي اقتراحات حول كيفية الحصول على هذا لإضافته إلى jpanel؟ أيضًا ، هل هذه طريقة جيدة للذهاب إلى تطفو الصورة حول الشاشة بشكل عشوائي للعبة؟

هل كانت مفيدة؟

المحلول

بادئ ذي بدء ، ليست هناك حاجة لتمديد JLabel للقيام بذلك.

أ) تقوم بتعيين حجم التسمية بعد إضافة الصورة إلى التسمية باستخدام:

label.setSize( label.getPreferredSize() );

ب) لا تحتاج إلى السحب () ، وجميع أساليب Setter. لنقل الملصق كل ما تفعله هو استخدام:

label.setLocation(...);

ج) إذا كنت تريد زيادة الموقع ، فستستخدم شيئًا مثل:

label.setLocation (label.getLocation (). x + 5 ، ...) ؛

بمجرد تعيين حجم الملصق وموقعه ، يمكنك إضافته مباشرة إلى اللوحة. تأكد من أنك فعلت:

panel.setPreferredSize() 

عند إضافة اللوحة الخاصة بك إلى جزء المحتوى من إطارك.

الكود الخاص بك غامض للغاية بحيث لا يمكن تقديم اقتراحات محددة. إذا كنت بحاجة إلى مزيد من المساعدة نشر SSCCE. قد تكون مشكلتك هي استخدام مدير التخطيط أو حقيقة أنك لا تستخدم مديري التخطيط.

نصائح أخرى

نعم ، يجب عليك تعيين مدير التخطيط لـ jpanel (gamepanel) على Null الذي يخبر النظام:

لا تضعها لي ، سأفعل ذلك يدويًا

تعديل

أعتقد أنه سيكون أكثر وضوحًا إذا أعطيتك عرضًا تجريبيًا.

انظر هذا المثال. كما يشير Camickr ، لست مضطرًا إلى التصنيف الفرعي للمكونات.

import javax.swing.*;
import java.util.Timer;
import java.util.*;

class FloatingDemo {
    public static void main( String [] args ){
        // create the panel         
        JPanel panel = new JPanel();
        panel.setLayout(null);

        // create the label with an image
        final JLabel label = new JLabel(new ImageIcon("StackOverflowLogo.png"));
        label.setSize(label.getIcon().getIconWidth(), 
                      label.getIcon().getIconHeight());
        panel.add( label );

        // create the frame containing both 
        JFrame frame = new JFrame();
        frame.add( panel );
        frame.setSize(800, 600 );
        frame.setVisible( true );

        // move it randomly every second  
        Timer timer = new Timer();
        final Random random = new Random();
        timer.schedule( new TimerTask() {
           public void run(){
                 label.setLocation( random.nextInt(800-label.getWidth()), 
                                    random.nextInt(600-label.getHeight()));       
           } 
        }, 0, 1000 );

    }
}

راجع للشغل ، وعدم تعيين مدير التخطيط على Null يعمل أيضًا ، ولكن إذا قمت بتغيير حجم النافذة ، فسيقوم JPanel بتعيين الموقع لك تلقائيًا.

تشغيل العرض التوضيحي

المشكلة الرئيسية التي أعتقد أنها لا تضيف الصورة إلى Head في مُنشرك.

ما عليك القيام به هو إنشاء جديد ImageIcon كما تفعل ، وفي مُنشرك ، افعل شيئًا يكمن في هذا ؛

public Head(int xpos, int ypos, int xvel, int yvel){
    // calls the JLabel constructor to create a label with an image
    super(new ImageIcon("C:\\Users\\jjpotter.MSDOM1\\Pictures\\clavalle.jpg"))
    this.xpos = xpos;
    this.ypos = ypos;
    this.xvel = xvel;
    this.yvel = yvel;
}

هذا سيخلق الخاص بك Head مع الصورة المحددة.

بمجرد فرز مشكلة المنشئ ، يمكنك بعد ذلك استدعاء SetLocation () عليك Head اعتراض من JPanel لقد أضفتها إلى. هكذا يمكنك تحريكها بشكل عشوائي.

أيضا ، في JPanel أنت تضيف Head إلى ، تحتاج إلى التأكد من تعيين ملف LayoutManaer إلى Null ، حتى تتمكن من وضع المكون يدويًا على اللوحة بنفسك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top