إنشاء JLabel باسطر متعددة Multi Line Label
منتدى مصر التقني :: قسم لغات البرمجة Programming languages :: لغة الجافا Java :: واجهة المستخدم الرسومية Java Swing
صفحة 1 من اصل 1 • شاطر
إنشاء JLabel باسطر متعددة Multi Line Label
اهلا وسهلا بكم
يوفر العنصر الرسومى حقل التسمية JLabel تعليمات نصية أو معلومات فى فى واجهة المستخدم الرسومية و ذلك عن طريق أظهار سطر نصى لكن المثال التالى سيوضح كيفية انسائه بعدد من الاسطر و ليس سطر واحد
![Surprised](/users/3211/33/39/82/smiles/3642912729.png)
يوفر العنصر الرسومى حقل التسمية 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](/users/3211/33/39/82/smiles/3642912729.png)
ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
![إنشاء JLabel باسطر متعددة Multi Line Label Do.php?imgf=154090993464951](http://egytech.eu5.org/kleeja-2.4/do.php?imgf=154090993464951.png)
NEXT- الادارة
- تاريخ التسجيل : 18/02/2011
المساهمات : 446
النقاط : 200660
التقيم : 28
الدولة :
الجنس :
رد: إنشاء JLabel باسطر متعددة Multi Line Label
مثال اخر :
- الكود:
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](http://egytech.eu5.org/kleeja-2.4/do.php?imgf=154090993464951.png)
NEXT- الادارة
- تاريخ التسجيل : 18/02/2011
المساهمات : 446
النقاط : 200660
التقيم : 28
الدولة :
الجنس :
| |
منتدى مصر التقني :: قسم لغات البرمجة Programming languages :: لغة الجافا Java :: واجهة المستخدم الرسومية Java Swing
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى
» تصميم تطبيق جوال لمغسلة ملابس
» تصميم تطبيق جوال لشركة عقارات
» شركة مكافحة النمل الابيض بالرياض
» تصميم تطبيق جوال لنقل الاثاث
» هناجر
» تصميم تطبيق جوال لمتجر ورد
» تصميم تطبيق جوال لسلسلة مطاعم
» تصميم تطبيق جوال لتوصيل الطلبات
» مظلات سيارات متحركة