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

إنشاء JLabel باسطر متعددة Multi Line Label

اذهب الى الأسفل

إنشاء JLabel باسطر متعددة Multi Line Label Empty إنشاء JLabel باسطر متعددة Multi Line Label

مُساهمة من طرف NEXT الخميس مايو 21, 2020 3:38 pm

اهلا وسهلا بكم

يوفر العنصر الرسومى حقل التسمية JLabel تعليمات نصية أو معلومات فى فى واجهة المستخدم الرسومية و ذلك عن طريق أظهار سطر نصى لكن المثال التالى سيوضح كيفية انسائه بعدد من الاسطر و ليس سطر واحد

الكود:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.util.StringTokenizer;

public class MultiLineLabel extends Canvas {
  public static final int LEFT = 0; // Alignment constants

  public static final int CENTER = 1;

  public static final int RIGHT = 2;

  protected String[] lines;       // مصفوفة النصوص التى سيتم اظهارها

  protected int num_lines;       // عدد  الاسطر التى سيتم انشائها

  protected int margin_width;   // الهوامش اليمينى و اليسري

  protected int margin_height;  // الهوامش العليا و السفلي

  protected int line_height;       // الارتفاع الكلي للخط

  protected int line_ascent;      // ارتفاع الخط فو خط الاساس

  protected int[] line_widths;    // مدى اتساع كل سطر

  protected int max_width;       // عرض اكبر خط

  protected int alignment = LEFT; // محاذاة النص .

  // تعمل هذة الطريقة على تقسيم النصوص الى مجموعة من الاسطر.
  // يستخدم فئة الأداة المساعدة StringTokenizer .
  protected void newLabel(String label) {
    StringTokenizer t = new StringTokenizer(label, "\n");
    num_lines = t.countTokens();
    lines = new String[num_lines];
    line_widths = new int[num_lines];
    for (int i = 0; i < num_lines; i++)
      lines[i] = t.nextToken();
  }

  // توضح هذه الطريقة مدى حجم الخط المستخدم فى التسمية ومدى اتساعه اتساع السطر له
 
  protected void measure() {
    FontMetrics fm = getFontMetrics(getFont());
    // إذا لم يكن لدينا مقاييس الخط حتى الآن ، فارجع فقط.
    if (fm == null)
      return;

    line_height = fm.getHeight();
    line_ascent = fm.getAscent();
    max_width = 0;
    for (int i = 0; i < num_lines; i++) {
      line_widths[i] = fm.stringWidth(lines[i]);
      if (line_widths[i] > max_width)
        max_width = line_widths[i];
    }
  }

  // فيما يلي أربعة إصدارات من المنشىء
  // قسّم عنصر التسمية Jlabel إلى أسطر منفصلة ، واحفظ المعلومات الأخرى.
  public MultiLineLabel(String label, int margin_width, int margin_height,
      int alignment) {
    newLabel(label);
    this.margin_width = margin_width;
    this.margin_height = margin_height;
    this.alignment = alignment;
  }

  public MultiLineLabel(String label, int margin_width, int margin_height) {
    this(label, margin_width, margin_height, LEFT);
  }

  public MultiLineLabel(String label, int alignment) {
    this(label, 10, 10, alignment);
  }

  public MultiLineLabel(String label) {
    this(label, 10, 10, LEFT);
  }

  // طرق لتعيين السمات المختلفة للمكون
  public void setLabel(String label) {
    newLabel(label);
    measure();
    repaint();
  }

  public void setFont(Font f) {
    super.setFont(f);
    measure();
    repaint();
  }

  public void setForeground(Color c) {
    super.setForeground(c);
    repaint();
  }

  public void setAlignment(int a) {
    alignment = a;
    repaint();
  }

  public void setMarginWidth(int mw) {
    margin_width = mw;
    repaint();
  }

  public void setMarginHeight(int mh) {
    margin_height = mh;
    repaint();
  }

  public int getAlignment() {
    return alignment;
  }

  public int getMarginWidth() {
    return margin_width;
  }

  public int getMarginHeight() {
    return margin_height;
  }
// يتم استدعاء هذه الطريقة بعد إنشاء لوحة الرسم
 // ولكن قبل أن يتم عرضه بالفعل. بعد ذلك
 // استدعى أسلوب addNotify () الخاص بالفئة الفائقة لدينا ، لدينا خط

  public void addNotify() {
    super.addNotify();
    measure();
  }

  // يتم استدعاء هذه الطريقة من قبل مدير التخطيط عندما يريد ذلك
    public Dimension getPreferredSize() {
    return new Dimension(max_width + 2 * margin_width, num_lines
        * line_height + 2 * margin_height);
  }

 
  public Dimension getMinimumSize() {
    return new Dimension(max_width, num_lines * line_height);
  }

  // هذه الطريقة تقوم برسم نص التسمية
  // لاحظ أنه يعالج الهوامش والمحاذاة ، لكن ذلك لا داعي للقلق بشأن اللون أو الخط
    // يعتني بتعيين تلك الموجودة في كائن الرسومات الذي تم تمريره

  public void paint(Graphics g) {
    int x, y;
    Dimension d = getSize();
    y = line_ascent + (d.height - num_lines * line_height) / 2;
    for (int i = 0; i < num_lines; i++, y += line_height) {
      switch (alignment) {
      case LEFT:
        x = margin_width;
        break;
      case CENTER:
      default:
        x = (d.width - line_widths[i]) / 2;
        break;
      case RIGHT:
        x = d.width - margin_width - line_widths[i];
        break;
      }
      g.drawString(lines[i], x, y);
    }
  }
}



Surprised

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
إنشاء JLabel باسطر متعددة Multi Line Label Do.php?imgf=154090993464951
NEXT
NEXT
الادارة
الادارة

تاريخ التسجيل : 18/02/2011
المساهمات : 446
النقاط : 200660
التقيم : 28
الدولة : مصر
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

إنشاء JLabel باسطر متعددة Multi Line Label Empty رد: إنشاء JLabel باسطر متعددة Multi Line Label

مُساهمة من طرف NEXT الخميس مايو 21, 2020 4:07 pm

مثال اخر :

الكود:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.SystemColor;
import java.util.StringTokenizer;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
 
/**
 * A class that allows the use a Multi-label Label
 *
 * @author      Internet
 */
public class MultiLabel extends JComponent implements SwingConstants
{
  private static final long serialVersionUID = -1611795277013703880L;
  int num_lines,line_height,line_ascent;
    int max_width  = -1;
    int text_height = -1;
    int[] line_widths;
    int btnMarginWidth =1;
   
    private String lines[]=null;
   
    private int horizontalAlignment = LEADING;
    private int textAlignment      = LEADING;
    private int verticalAlignment  = CENTER;
   
    public MultiLabel()
    {
        this("", LEADING, LEADING, CENTER);
    }
    public MultiLabel(String text)
    {
        this(text, LEADING, LEADING, CENTER);
    }
    public MultiLabel(String text, int horizontalAlignment)
    {
        this(text, horizontalAlignment, LEADING, CENTER);
    }
    public MultiLabel(String text, int horizontalAlignment, int textAlignment)
    {
        this(text, horizontalAlignment, textAlignment, CENTER);
    }
    public MultiLabel(String str, int horizontalAlignment, int textAlignment, int verticalAlignment)
    {
        this.setForeground(UIManager.getColor("Label.foreground"));
        this.setBackground(UIManager.getColor("Label.background"));
        this.setFont      (UIManager.getFont ("Label.font"));
       
        setText(str);
        this.horizontalAlignment = horizontalAlignment;
        this.textAlignment = textAlignment;
        this.verticalAlignment = verticalAlignment;
    }
   
    public void setText(String text)
    {
        if (text == null) text="";
       
        StringTokenizer tkn = new StringTokenizer(text,"\n");
       
        num_lines = tkn.countTokens();
        lines      = new String[num_lines];
        line_widths = new int  [num_lines];
       
        for (int i=0;i<num_lines;i++)
            lines[i] = tkn.nextToken();
       
        recalculateDimension();
    }
   
    public void addText(String text)
    {
      if (text == null) text="";
      StringTokenizer tkn = new StringTokenizer(text,"\n");
       
        String[] prev = new String[num_lines];
        int prevNum = num_lines;
        for (int i = 0 ; i < num_lines ; i++)
        {
          prev[i] = lines[i];
        }
       
        num_lines += tkn.countTokens();
        lines      = new String[num_lines];
        line_widths = new int  [num_lines];
       
        for (int i=0;i<prevNum;i++)
            lines[i] = prev[i];
       
        for (int i=prevNum;i<num_lines;i++)
            lines[i] = tkn.nextToken();
       
        recalculateDimension();
    }
 
    private void recalculateDimension()
    {
        FontMetrics fontmetrics=getFontMetrics(getFont());
       
        line_height=fontmetrics.getHeight();
        line_ascent=fontmetrics.getAscent();
       
        max_width=0;
        for (int i=0;i<num_lines;i++)
        {
            line_widths[i] = fontmetrics.stringWidth(lines[ i ]);
           
            max_width = Math.max(max_width, line_widths[i]);
        }
       
        max_width += 2*btnMarginWidth;
        text_height=num_lines*line_height;
  }
 
 
    public Dimension getPreferredSize()
    {
        return getMinimumSize();
    }
 
    public Dimension getMaximumSize()
    {
        return new Dimension(Short.MAX_VALUE, Short.MAX_VALUE);
    }
   
    public Dimension getMinimumSize()
    {
        if (max_width == -1 || text_height == -1) recalculateDimension();
       
        Insets insets = getInsets();
       
        return new Dimension(max_width  + insets.left + insets.right,
                            text_height + insets.top  + insets.bottom);
    }
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Dimension d = getSize();
 
        if (d.width  != max_width || d.height != text_height)
            recalculateDimension();
       
        Insets insets = this.getInsets();
       
        int y = 0;
       
        if (verticalAlignment == TOP)
        {
            y = insets.top + line_ascent;               
        }
        else if (verticalAlignment == CENTER)
        {
        //These two are must musts:
            y = insets.top + line_ascent;
           
          //So far it looks like the TOP case, BUT:
            int clientAreaHeight = d.height - insets.top - insets.bottom;
            y = y + (clientAreaHeight - text_height) / 2;
        }
        else if (verticalAlignment == BOTTOM)
        {
            int clientAreaBottom = d.height - insets.bottom;
           
            y = clientAreaBottom - text_height;
           
            y += line_ascent; 
        }
       
       
        for (int i=0; i<num_lines; i++)
        {
            int ha = getBidiHorizontalAlignment(horizontalAlignment);
           
            int x = 0;
           
            if (ha == LEFT)
            {
                ha = getBidiHorizontalAlignment(textAlignment);
                    if (ha == LEFT  ) x = insets.left;
                else if (ha == RIGHT ) x = max_width - line_widths[i] + insets.left;
                else if (ha == CENTER) x = insets.left + (max_width - line_widths[i]) / 2;
            }
            else if (ha == RIGHT)
            {
                ha = getBidiHorizontalAlignment(textAlignment);
                    if (ha == LEFT  ) x = d.width - max_width - insets.right;
                else if (ha == RIGHT ) x = d.width - line_widths[i] - insets.right;
                else if (ha == CENTER) x = d.width - max_width - insets.right+ (max_width - line_widths[i]) / 2;
            }
            else if (ha == CENTER)
            {
                ha = getBidiHorizontalAlignment(textAlignment);
               
            // Just imagine that ha=LEFT (much easier), and follow code
                int  clientAreaWidth = d.width - insets.left - insets.right;
                    if (ha == LEFT  ) x = insets.left + (clientAreaWidth - max_width) / 2;
                else if (ha == RIGHT ) x = insets.left + (clientAreaWidth - max_width) / 2 + (max_width-line_widths[i]);
                else if (ha == CENTER) x = insets.left + (clientAreaWidth - line_widths[i]) / 2;
            }
            x+=btnMarginWidth;
            g.drawString(lines[i],x,y);
           
            y+=line_height;
        }
  }
 
  private int getBidiHorizontalAlignment(int ha)
  {
        if (ha == LEADING)
        {
            if (getComponentOrientation().isLeftToRight())
                ha = LEFT;
            else ha = RIGHT;
        }
        else if (ha == TRAILING)
        {
            if (getComponentOrientation().isLeftToRight())
                ha = RIGHT;
            else ha = LEFT;
        }
        return ha;
    }
   
    public int getVerticalAlignment()
    {
        return this.verticalAlignment;
    }
   
    public void setVerticalAlignment(int verticalAlignment)
    {
        this.verticalAlignment = verticalAlignment;
        repaint();
    }
   
   
   
    public int getHorizontalAlignment()
    {
        return this.horizontalAlignment;
    }
   
    public void setHorizontalAlignment(int horizontalAlignment)
    {
        this.horizontalAlignment = horizontalAlignment;
        repaint();
    }
   
   
   
    public int getTextAlignment()
    {
        return this.textAlignment;
    }
   
    public void setTextAlignment(int textAlignment)
    {
        this.textAlignment = textAlignment;
        repaint();
    }
 
 
    @SuppressWarnings("deprecation")
  public static void main(String args[]) throws Exception
    {
        String wiseText = "This is a true example\n"+
                          "Of the MultiLine"  + "\n" +
                          "Label class";
       
        MultiLabel x0 = new MultiLabel(wiseText);
        MultiLabel x1 = new MultiLabel(wiseText, MultiLabel.RIGHT , MultiLabel.RIGHT);
        MultiLabel x2 = new MultiLabel(wiseText, MultiLabel.CENTER);
        MultiLabel x3 = new MultiLabel(wiseText, MultiLabel.CENTER, MultiLabel.RIGHT);
        MultiLabel x4 = new MultiLabel(wiseText, MultiLabel.CENTER, MultiLabel.CENTER);
        MultiLabel x5 = new MultiLabel(wiseText, MultiLabel.RIGHT , MultiLabel.LEFT, MultiLabel.BOTTOM);
       
        JPanel
        mainPanel = new JPanel(new GridLayout(3,2,15,15));
        mainPanel.add(x0);  mainPanel.add(x1);
        mainPanel.add(x2);  mainPanel.add(x3);
        mainPanel.add(x4);  mainPanel.add(x5);
        mainPanel.setBackground(SystemColor.control);
        mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        for (int i=0; i < mainPanel.getComponentCount(); i++)
            ((JComponent) mainPanel.getComponent(i)).setBorder(new LineBorder(Color.red));
       
       
        JFrame fr = new JFrame("MultiLabel Example");
        fr.getContentPane().add(mainPanel);
        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fr.setSize(460,350);
        fr.setLocationRelativeTo(null);
        fr.show();     
    }
}

 

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
إنشاء JLabel باسطر متعددة Multi Line Label Do.php?imgf=154090993464951
NEXT
NEXT
الادارة
الادارة

تاريخ التسجيل : 18/02/2011
المساهمات : 446
النقاط : 200660
التقيم : 28
الدولة : مصر
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

كاتب هذه المساهمة مطرود حالياً من المنتدى - معاينة المساهمة

الرجوع الى أعلى الصفحة

ََ

مواضيع ذات صلة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى