الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة فى إظهار Image

بدأه mr.beshoy في 7 أبريل 2010 · 5 رد · 633 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هنا و فى هذا الكود البسيط أواجه مشكلتان :

--------------------------------------------------

1- قمت بإنشاء panel صفراء اللون ، أريدها فى منتصف ال panel الأم قمت بعمل ذاك :

 x = testGame.getPanel().getWidth() / 2;
        y = testGame.getPanel().getHeight() / 2;
        setLocation(x, y);

و لكنها لم تظهر فى المنتصف . لماذا ؟؟

و أريد أن أُظهر صورة على هذه ال Panel الصفراء و قمت فعلاً برسمها و لكنها لم تظهر لماذا ؟!!

الكود :

----------------

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestGame extends JFrame {

    private JPanel panel;
    private MainPanel mainPanel;

    public TestGame() {
        panel = new JPanel();
        mainPanel = new MainPanel(this);
        panel.add(mainPanel);
        getContentPane().add(panel);

    }

    public JPanel getPanel() {
        return panel;
    }

    public static void main(String[] args) {
        TestGame testGame = new TestGame();
        testGame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        testGame.setSize(new Dimension(600, 300));
        testGame.setLocationRelativeTo(null);
        testGame.setVisible(true);
        testGame.setExtendedState(MAXIMIZED_BOTH);
    }
}
--------------------------------------------------------------------------------------------------------
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class MainPanel extends JPanel {

    private int x, y;
    private ImageIcon imageIcon;

    public MainPanel(TestGame testGame) {
        x = testGame.getPanel().getWidth() / 2;
        y = testGame.getPanel().getHeight() / 2;
        setLocation(x, y);
        setPreferredSize(new Dimension(200, 400));
        setBackground(Color.YELLOW);
        ///////////////////////////////////////////////////////////////
        imageIcon = new ImageIcon("F.bmp");
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(imageIcon.getImage(), 200, y, this);
    }
}

الكود مرفق و مع الصورة .

شكراً

Game.rar

#2

الجواب بالأسفل :)

تم تعديل هذه المشاركة بواسطة Speed_Of_Light في 7 أبريل 2010 في 16:33

#3

قم بتعديل الكود ليصبح بالشكل التالي

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JPanel;


public class TestGame extends JFrame {

    private JPanel panel;
    private MainPanel mainPanel;

    public TestGame() {


        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(new Dimension(600, 300));
        setLocationRelativeTo(null);
        setExtendedState(MAXIMIZED_BOTH);



        setVisible(true);

        panel = new JPanel();
        getContentPane().add(panel);
        panel.setLayout(null);
        mainPanel = new MainPanel(this);
        panel.add(mainPanel);
    }

    public JPanel getPanel() {
        return panel;
    }

    public static void main(String[] args) {
        new TestGame();
    }
}



 class MainPanel extends JPanel {

    private int x, y;
    private ImageIcon imageIcon;

    public MainPanel(TestGame testGame) {


        setPreferredSize(new Dimension(200, 400));
        setSize(getPreferredSize());
        x = testGame.getWidth() / 2 - getWidth() / 2;
        y = testGame.getHeight() / 2 - getHeight() / 2;
        setLocation(x, y);
        setBackground(Color.YELLOW);
        ///////////////////////////////////////////////////////////////
        imageIcon = new ImageIcon("F.bmp");
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(imageIcon.getImage(), 0, 0, this);
    }
}

إذا انتبهت إلى التعديلات وعرفت أين الأخطاء في كودك فهذا جيد، وإذا أردت شرحا لهذه الأخطاء فأنا جاهز للمساعدة إن شاء الله

تم تعديل هذه المشاركة بواسطة * ياسر * في 7 أبريل 2010 في 16:39

1
#4

شكراً أخ speed_of_light

---------------------------------

أخ ياسر :

----------------

أولاً شكراً لتعبك .

ثانياً: أان كنت فى ال class TestGaem عامل دالة اسمها getPanel الهدف منها انادم عليها فى الclass MainPanel لأجل ما أحصل على ظول و ارتفاع هذه ال panel

و لكنك لما تستعملها أطلاقاً و استعملت ال class TestGame نفسه لماذا ؟؟

النقطة الثانية : x = testGame.getWidth() / 2 - getWidth() / 2

لماذا تطرح : - getWidth() / 2 أنا عرفت أنها مهمه . لكن ليه مش فاهمها كويس ؟ أقصد أقول كان كفاية جداً x = testGame.getWidth() / 2;

على فكرة ال panel الصفراء مش بتظهر إلا لما أضغر الشاشة و أكبرها مرة أخرى ..

و عملت revalidate(); بعد setLocation();

لكن دون جدوى

أتمنى تجاوبنى ... شكراً

----------------------------------------------------------------------

انا عندما أخفقت فى هذه الطريقة عملت طريقة أخرى .

الملف مرفق

Game.rar

#5

السبب هو أنك تضيف هذه الـ JPanel في داخل الـ JFrame بشكل مباشر، بالتالي (وبما أن وضع الطبيعي للـ LayoutManager في JFrame هو BorderLayout) فإن حجم الـ JPanel سيتيغر تلقائيا إلى حجم الـ JFrame الذي أضيفت في داخله

أما بالنسبة لطرح نصف عرض وطول الـ JPanel الصفراء فهو لأن الدالة setLocation تأخذ إحداثيات النقطة العليا اليسرى للكائن وليس منتصفه. لذلك نحتاج لهذه الإزاحة.

ملاحظة أخرى: بما أن MainPanel هو امتداد لـ JPanel يمكنك إضافته مباشرة في داخل JFrame. ولا تحتاج لعمل JPanel آخر لتضيفه في داخله

آخر ملاحظة: انتبه لترتيب الخطوات: لا تقم باستدعاء getWidth أو getHeight قبل أن تكون أصلا عينت حجم الكائن. وحاول أن تضع جميع الأوامر الخاصة ببناء الكائن في داخل الـ Constructor

أتمنى أن أكون أفدتك

#6

شكراً جداً ... معلومات قيمة و مفيدة ..ربنا يعوضك .

لكن فى مشكلة و هى إن ال panel الصفراء لا تظهر إلا عندما أقوم بتصغير ال frame و تكبيرها .لماذا ؟!!

و عندما أقوم بوضع الجزء هذا داخل ال Main

    TestGame testGame = new TestGame();
        testGame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        testGame.setSize(new Dimension(600, 300));
        testGame.setLocationRelativeTo(null);
        testGame.setVisible(true);
        testGame.setExtendedState(MAXIMIZED_BOTH);

الى بيحصل أن ال panel الصفراء تظهر فى بداية ال frame و مش كلها ...ليش كده ؟؟!!! و أان بحب أضع جزء ال code السابق داخل ال main ()

شكراً

تم تعديل هذه المشاركة بواسطة mr.beshoy في 8 أبريل 2010 في 13:25

مواضيع مشابهة