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

مشكلة فى ضبط panel تحتوع على صورة

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

هنا يوجد Panel تسمى imagePanel تحتوى على صورة و تم وضع هذه ال panel على ال componentPanel لكن الاولى تظهر صغيرة جدا جدا و تظهر فى الوضع الشمالى رغم استعمال BorderLayout.Center

ال code

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

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

public class ServicesMainFrame extends JFrame {

    private JPanel mainPanel, componentPanel, buttonsPanel;
   private ImagePanel imagePanel;

    public ServicesMainFrame() {
        createPanel();
        getContentPane().add(mainPanel);
    }

    public static void main(String[] args) {
        ServicesMainFrame servicesMainFrame = new ServicesMainFrame();
        servicesMainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        servicesMainFrame.setSize(new Dimension(600, 300));
        servicesMainFrame.setLocationRelativeTo(null);
        servicesMainFrame.setVisible(true);
        servicesMainFrame.setExtendedState(MAXIMIZED_BOTH);
    }

    private void createPanel() {
        mainPanel = new JPanel();
        componentPanel = new JPanel(new BorderLayout());
        /////////////////////////////////////////////////////////
        imagePanel = new ImagePanel();
        componentPanel.add(imagePanel, BorderLayout.CENTER);
        mainPanel.add(componentPanel);
    }
}

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

class ImagePanel extends JPanel {

    private ImageIcon imageIcon;

    public ImagePanel() {

        imageIcon = new ImageIcon(getClass().getResource("images/pic.jpg"));
        setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
        setSize(new Dimension(imageIcon.getIconWidth(), imageIcon.getIconHeight()));
    }

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

الكود مرفق

services.rar

#2

ياخي ليش يعجبك تدخل طريق مادخلوه عرب مثلما يقولوا ؟ happy.gif

حط صورتك داخل JLabel وريح نفسك


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#3
اقتباس
ياخي ليش يعجبك تدخل طريق مادخلوه عرب مثلما يقولوا ؟

حط صورتك داخل JLabel وريح نفسك

:blink: :blink:

يمكنك وضع صورة على جميع مكونات swing ولا يوجد تفضيل لأحدها على آخر ! وإذا كنت معتاداً على أحدها فهذا لا يعني أنه الأفضل !

بلا عنصرية لو سمحت :lol:

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

@ mr.beshoy:

صحيح أنك تضيف الـ imagePanel إلى الـ componentPanel بطريقة صحيحة (باستخدام BorderLayout.Center) لكنك عندما تضيف الـ componentPanel إلى الـ mainPanel لا تقوم بذلك !

هكذا يجب أن يكون الكود هنا:

   private void createPanel() {
        mainPanel = new JPanel(new BorderLayout());
        componentPanel = new JPanel(new BorderLayout());
        /////////////////////////////////////////////////////////
        imagePanel = new ImagePanel();
        componentPanel.add(imagePanel, BorderLayout.CENTER);
        mainPanel.add(componentPanel, BorderLayout.CENTER);
    }
#4

فعلت مثلما قولت و تم ظهور الصورة كلها

و لكن للاسف الpanel الحاوية للصورة لم تظهر فى المنتصف

private void createPanel() {
        mainPanel = new JPanel(new BorderLayout());
        imagePanel = new ImagePanel();
        //////////////////////////////////////////////////////////
        componentPanel = new JPanel(new BorderLayout());
      //  componentPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
        componentPanel.setPreferredSize(new Dimension(imagePanel.getWidth(), imagePanel.getHeight()));
        /////////////////////////////////////////////////////////
        componentPanel.add(imagePanel, BorderLayout.CENTER);
        mainPanel.add(componentPanel,BorderLayout.CENTER);
    }

الشفيرة المعدلة مرفقة

services.rar

#5

بل الحاوية ظهرت في المنتصف وتمددت على كامل الـ JFrame ... وللتأكد من ذلك قم بتغيير لون الـ imagePanel

       imagePanel.setBackground(Color.red);

لكن الصورة المرسومة عليها لم تظهر في منتصف الـ imagePanel، وهذا طبيعي ! وسببه هذا السطر:

g.drawImage(imageIcon.getImage(), 0, 0, this);

ولجعل الصورة دائماً في منتصف الـ imagePanel عليك استبداله بما يلي:

        int x = this.getWidth()/2 - imageIcon.getIconWidth()/2;
        int y = this.getHeight()/2 - imageIcon.getIconHeight()/2;
        g.drawImage(imageIcon.getImage(),x , y, this);
#6

العملية تمام . و لكن المشكلة أنى لا أريد ال ImagePanel تاخد ملئ ال frame بل ال componentPanel

جعلت ال componentPanel باللون الأزرق و لكن لم تتاثر

لماذا؟؟

   private void createPanel() {
        mainPanel = new JPanel(new BorderLayout());
        imagePanel = new ImagePanel();
        //////////////////////////////////////////////////////////
        componentPanel = new JPanel(new BorderLayout());
        componentPanel.setBackground(Color.BLUE);
        //  componentPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
      //  componentPanel.setPreferredSize(new Dimension(imagePanel.getWidth(), imagePanel.getHeight()));
        /////////////////////////////////////////////////////////
        componentPanel.add(imagePanel, BorderLayout.CENTER);
        mainPanel.add(componentPanel, BorderLayout.CENTER);
    }

شكراً

#7

بل تأثرت :lol: لكنك لا تستطيع رؤيتها، وهذا أيضاً طبيعي

أنت أضفت الـ imagePanel إلى الـ componentPanel مع BorderLayout.CENTER

لاحظ أن الـ componentPanel لا تحوي سوى الـ imagePanel وبما أنك اخترت BorderLayout.CENTER فسيتم تكبير الـ imagePanel لتعطي كامل مساحة الـ componentPanel

هل توضح الأمر؟

ما الذي ترغب بعمله تحديداً ؟

#8
اقتباس
يمكنك وضع صورة على جميع مكونات swing ولا يوجد تفضيل لأحدها على آخر ! وإذا كنت معتاداً على أحدها فهذا لا يعني أنه الأفضل !

أعلم ان جميع ادوات الـSwing تقبل الرسم عليها ووضع صور عليها ولكن هل كلها تستخدم هذه الطريقه؟wink.gif

JLabel lab = new JLabel(new ImageIcon("img.png"));

فهمت قصدي؟


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#9

فهمت قصدك ... هذا الباني constructor ليس موجوداً في جميع مكونات swing

لكن هذا لا يشكل أي فرق، أليس كذلك ؟

#10

JRadioButton, JCheckBox, JButton, JMenuItem, JToggleButton

كل هذه المكونات، بالإضافة ل JLabel، تحتوي على constructor ينتظر Icon، التي ترث منها ImageIcon.

رسم الصورة داخل paintComponent يعطي تحكم أكبر في طريقة الرسم.

تم تعديل هذه المشاركة بواسطة herch في 5 مارس 2010 في 01:41

#11

أعلم , لكن كان قصدي من حيث السهوله فقط , بالنسبه للطريقه التي ذكرتها للأمانه ماقد جربتها على الصور فهل يمكن من خلالها التحكم بحجم الصوره (تكبير , تقليص) ؟


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#12

أواجه مشكلة عنيفة و مملة من مشاكل ال GUI

الأن كل ما أريده هو وضع الصورة على الجانب الشرقى ( استعملت BordeLayout.EAST)

و وضع ال buttonPanel فى المنتصف استعملت BorderLAyout.center

و لكن المشكلة أن buttonPanel تاخذ مساحة كبيرة و imagePanel نصفها مخفى

الكود مرفق + صورة لتوضيح الشكل الذى أريده

شكراً

services.rar

untitled.rar

تم تعديل هذه المشاركة بواسطة mr.beshoy في 5 مارس 2010 في 01:56

#13

لماذا لا تستعمل ال designer الخاص ب NetBeans لبناء الواجهة؟؟

#14

استبدل هذين السطرين:

       mainPanel.add(componentPanel, BorderLayout.EAST);
        mainPanel.add(buttonsPanel, BorderLayout.CENTER);

بهذين:

        mainPanel.add(componentPanel, BorderLayout.CENTER);
        mainPanel.add(buttonsPanel, BorderLayout.WEST);

هل هذا ما تريده ؟

#15

معلش أخ عصام انا مُصر اكتبهم دلوقتى .

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

أخ spee_of_light

أريد أن ال panel التى تُسمى componetPanel تحوى داخل حاوية الزراير و الصورة .

الدالة المعدلة و لكن لاتحقق ما اريده

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

    private void createPanel() {
        mainPanel = new JPanel(new BorderLayout());
        imagePanel = new ImagePanel();
        buttonsPanel = new JPanel(new GridLayout(3, 1));
        //////////////////////////////////////////////////////////
        componentPanel = new JPanel(new BorderLayout());
        ////////////////////////////////////////////////////////
        componentPanel.add(imagePanel, BorderLayout.EAST);
        componentPanel.add(buttonsPanel, BorderLayout.CENTER);
        mainPanel.add(componentPanel, BorderLayout.CENTER);
    }

و أريد المظهر كما بالصورة المرفقة .

شكرا

untitled.rar

#16
/**
 *
 * @author beshoy
 */
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ServicesMainFrame extends JFrame {

	private JPanel mainPanel, componentPanel;
	private Box buttonsBox;
	private JButton[] buttons;
	private String[] buttonNames = {"first process", "second Process", "third process"};
	private ImagePanel imagePanel;

	public ServicesMainFrame() {
		createPanel();
		createButtons();
		getContentPane().add(mainPanel);
	}

	public static void main(String[] args) {
		ServicesMainFrame servicesMainFrame = new ServicesMainFrame();
		servicesMainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		servicesMainFrame.setSize(new Dimension(600, 300));
		servicesMainFrame.setLocationRelativeTo(null);
		servicesMainFrame.setVisible(true);
		servicesMainFrame.setExtendedState(MAXIMIZED_BOTH);
	}

	private void createPanel() {
		mainPanel = new JPanel(new BorderLayout());
		imagePanel = new ImagePanel();
		buttonsBox = Box.createVerticalBox();
		//////////////////////////////////////////////////////////
		componentPanel = new JPanel(new BorderLayout());
		componentPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
		/////////////////////////////////////////////////////////
		componentPanel.add(imagePanel, BorderLayout.CENTER);
		mainPanel.add(componentPanel, BorderLayout.CENTER);
		mainPanel.add(buttonsBox, BorderLayout.WEST);
	}

	private void createButtons() {
		buttons = new JButton[buttonNames.length];
		for (int i = 0; i < buttonNames.length; ++i) {
			buttons = new JButton(buttonNames);
			buttonsBox.add(buttons);
		}
	}
}

تم تعديل هذه المشاركة بواسطة herch في 5 مارس 2010 في 02:52

#17

الصورة المرفقة غير واضحة !

أظنك تريد جعل قائمة الأزرار لا تمتد على طول النافذة ...

في المرفقات مثالين على ذلك

1.java

2.java

#18

شكراً لكم جميعاً ..

لكن معلش استحملونى باقى مشكلة اخيرة

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

أنا أولا زودت قيمة ال X الخاص بال imgePanel حتى تتحرك الصورة ناحية اليمين قليلاً .

كما فى التالى :

  protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        x = this.getWidth() / 2 - imageIcon.getIconWidth() / 2;
        y = this.getHeight() / 2 - imageIcon.getIconWidth() / 2;
        g.drawImage(imageIcon.getImage(), x+300, y, this);
    }

و لكن قائمة الزراير أريدها ان لا تكون فى أقصى الشمال كما هو الوضع حالياً فى الصورة الناتجة من البرنامج .بل أريدها تكون فى المنتصف و أن لاتكون قيمة ال y الخاصة بهذه ال buttonsPanel أول الشاشة بل تنزل قليلاً لأسفل

جربت طرق و لكن الصورة تختفى

الكود المعدل :

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

 private void createPanel() {
        mainPanel = new JPanel(new BorderLayout());
        imagePanel = new ImagePanel();
        ////////////////////////////////////////////////////////////////
        buttonsPanel = new JPanel(new GridLayout(15, 1));
     //   buttonsPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 5));
        //////////////////////////////////////////////////////////
        mainPanel.add(imagePanel, BorderLayout.CENTER);
        mainPanel.add(buttonsPanel, BorderLayout.WEST);
    }

    private void createButtons() {
        buttons = new JButton[buttonNames.length];
        for (int i = 0; i < buttonNames.length; ++i) {
            buttons = new JButton(buttonNames);
            //buttons.setPreferredSize(new Dimension(200, 30));
            buttonsPanel.add(buttons);
        }
    }
}

الكود بتعديله الجديد

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

معلش استحملوا اسئلتى هذه

untitled.rar

تم تعديل هذه المشاركة بواسطة mr.beshoy في 5 مارس 2010 في 04:16

#19

لو سمحت يا شباب مش عارف أجعل ال buttonsPanel فى المنتصف .....كل ما أحركها للمنتصف تمتد على ال frame كله و الصورة تختفى

المشكلة ان ال ImagePanel كبيرة جدا و اخدة أغلب ال frame كما فى الصورة المرفقة و المفروض تأخذ حجم الصورة فقط عشان أعرف أحرك ال buttonsPanel اامنتصف

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

ياريت تساعدونى فى النقطة دى.

شكرأً

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

#20

الصورة المرفقة

untitled.rar

untitled.rar

#21

الملف المرفق هذا به

الشفيرة الاخيرة و صفحة pdf بها الشكل الذى أريد إخراجه .

ال Output ستجدونه مختلف عن ال pdf

حيث أن ال imagePanel ممتدة على طول ال frame و ال buttonPanel على أخر ال frame

شكرا

New Folder.rar

#22

والله عجزت معك يا mr.beshoy ...

هكذا تريد الأزرار طايرة في وسط النافذة ولا شيء على يسارها ؟!

هذه آخر مرة أجيبك فيها عن هذا الموضوع ... إن لم يناسبك الحل حاول تعديله ! واعتمد على نفسك قليلاً لأن كل شيئ أصبح واضحاً جداً !

أليس كذلك ؟!

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ServicesMainFrame extends JFrame {

    private JPanel mainPanel, componentPanel, buttonsPanel;
    private JButton[] buttons;
    private String[] buttonNames = {"first process", "second Process", "third process"};
    private ImagePanel imagePanel;

    public ServicesMainFrame() {
        createPanel();
        createButtons();
        getContentPane().setLayout(null);
        getContentPane().add(mainPanel);
    }

    public static void main(String[] args) {
        ServicesMainFrame servicesMainFrame = new ServicesMainFrame();
        servicesMainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        servicesMainFrame.setSize(new Dimension(600, 300));
        servicesMainFrame.setLocationRelativeTo(null);
        servicesMainFrame.setVisible(true);
        servicesMainFrame.setExtendedState(MAXIMIZED_BOTH);
    }

    private void createPanel() {
        mainPanel = new JPanel(new BorderLayout());
        mainPanel.setBounds(200, 50, 600, 300);
        imagePanel = new ImagePanel();
        buttonsPanel = new JPanel(new GridLayout(10, 1));
        componentPanel = new JPanel(new BorderLayout());
        componentPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
        componentPanel.add(imagePanel, BorderLayout.CENTER);
        mainPanel.add(componentPanel, BorderLayout.CENTER);
        mainPanel.add(buttonsPanel, BorderLayout.WEST);
    }

    private void createButtons() {
        buttons = new JButton[buttonNames.length];
        for (int i = 0; i < buttonNames.length; ++i) {
            buttons = new JButton(buttonNames);
            buttonsPanel.add(buttons);
        }
    }
}
#23

في داخل painComponent الخاص بـ ImagePanel استخدم الكود التالي بدلا من السابق :

protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Image img = imageIcon.getImage();
        int img_width = img.getWidth(this);
        int img_Heigh = img.getHeight(this);
        Point midPoint = new Point(img_width/2,img_Heigh/2);

        //x = this.getWidth() / 2 - imageIcon.getIconWidth() /2;
        //System.out.println(x);
        //y = this.getHeight() / 2- imageIcon.getIconWidth() / 2;
        //System.out.println(y);

        int scalX = this.getWidth()/2 - midPoint.x;
        System.out.println("scalX := "+scalX);
        int scalY = this.getHeight()/2 - midPoint.y;
        System.out.println("scalY := "+scalY);

        //g.drawImage(imageIcon.getImage(), x + 300, y, this);
        g.drawImage(imageIcon.getImage(), scalX, scalY, this);
    }
#24

معلش يا شباب ..أنا عارف أنى تعبتكم بس استحملونى .

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

الآن تمكنت من وضع الImagePanel بطريقة مناسبة و تكون لها حجم الصورة فقط و لكن مشكلتى الآن أن ال buttonPane لاأستطيع تحجيمها . أريدها تكون لها width=200 مثلاً افعل ذلك و لكنها تظل كبيرة و أريد بين ال buttobPanel و ال imagePanel

مسافة ( بحيث لم يكونوا متلامسين )

الكود

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

import java.awt.*;
import javax.swing.*;
import javax.imageio.ImageIO;
import java.net.URL;

public class ServicesMainFrame extends JFrame {

    private JPanel mainPanel, componentPanel, buttonsPanel;
    private ImagePanel imagePanel;
    private JButton[] buttons;
    private String[] buttonNames = {"first", "second", "third"};

    public ServicesMainFrame(Image image) {
        createPanel(image);
        createButtons();
        getContentPane().add(mainPanel);
    }

    private void createPanel(Image image) {
        mainPanel = new JPanel(new BorderLayout());
        componentPanel = new JPanel(new BorderLayout());
        /////////////////////////////////////////////////////////
        imagePanel = new ImagePanel(image);
        componentPanel.add(imagePanel, BorderLayout.EAST);
        //////////////////////////////////////////////////////////
        JPanel centerPanel = new JPanel(new GridBagLayout());
        centerPanel.add(componentPanel, new GridBagConstraints());
        mainPanel.add(centerPanel, BorderLayout.EAST);
        /////////////////////////////////////////////////////////////////////
        buttonsPanel = new JPanel(new GridLayout(15, 1, 3, 3));
        buttonsPanel.setPreferredSize(new Dimension(200, 300));
        buttonsPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
        buttonsPanel.setBackground(Color.red);
//        JPanel centerPanel1 = new JPanel(new GridBagLayout());
//        componentPanel.add(buttonsPanel, BorderLayout.CENTER);
//        centerPanel1.add(componentPanel, new GridBagConstraints());
        mainPanel.add(buttonsPanel, SwingConstants.CENTER);
    }

    public static void main(String[] args) throws Exception {
        URL imageURL = new URL("http://www.soundwordsministries.com/wp-content/uploads/2008/05/mothers-day-flowers.jpg");
        Image image = ImageIO.read(imageURL);
        ServicesMainFrame servicesMainFrame = new ServicesMainFrame(image);
        servicesMainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        servicesMainFrame.setSize(new Dimension(600, 300));
        servicesMainFrame.setLocationRelativeTo(null);
        servicesMainFrame.setVisible(true);
        servicesMainFrame.pack();
        servicesMainFrame.setExtendedState(MAXIMIZED_BOTH);
    }

    private void createButtons() {
        buttons = new JButton[buttonNames.length];
        for (int i = 0; i < buttonNames.length; ++i) {
            buttons = new JButton(buttonNames);
            buttonsPanel.add(buttons);
        }
    }
}

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.BorderFactory;
import javax.swing.JPanel;

public class ImagePanel extends JPanel {

    private Image image;

    public ImagePanel(Image image) {

        this.image = image;
        setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
        setPreferredSize(new Dimension(image.getWidth(this), image.getHeight(this)));
    }

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

الشفيرة مرفقة

و شاكر لكم حسن تعاونكم و تعبكم معى

services.rar

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