PDA

View Full Version : سوال ساده در مورد آرایه



cnmeysam
جمعه 12 آبان 1396, 14:18 عصر
سلام
چطوری میتونم یه آرایه تعریف کنم که اعداد 1 تا 30 رو توی jlabel نمایش بده
for (int i=0;i==30;i++) {
sum=sum+i;


}

حلقه رو نوشتم و 30 تا هم لیبل دارم ولی اینکه این اعداد رو توی لیبل هایی که ساختم نمایش بده رو نمیدونم چیکار کنم
میدونم باید یه آرایه بسازم ولی راهش رو بلد نیستم
اگه میشه کمکم کنید ممنون از وقتی که گذاشتید

vahid-p
جمعه 12 آبان 1396, 15:43 عصر
در تعریف آرایه اشیاء به جز تعریف اندازه آرایه باید برای تمام خانه های آرایه یک شیء بسازید یا نسبت بدید.
مثلا چیزی که گفتید این شکلی میشه تعریف کرد:
JLabel labels[30];
for(int i=0 ; i<labels.length ; i++){
labels[i] = new JLabel(String.valueOf(i+1));
}

cnmeysam
جمعه 12 آبان 1396, 17:46 عصر
در تعریف آرایه اشیاء به جز تعریف اندازه آرایه باید برای تمام خانه های آرایه یک شیء بسازید یا نسبت بدید.
مثلا چیزی که گفتید این شکلی میشه تعریف کرد:
JLabel labels[30];
for(int i=0 ; i<labels.length ; i++){
labels[i] = new JLabel(String.valueOf(i+1));
}

سلام
ارور میده متاسفانه
برای JLabel labels[30];
']' expected ارور رو میده

vahid-p
شنبه 13 آبان 1396, 13:18 عصر
آره ببخشید به سبک C++‎‎‎‎‎‎ نوشتم :لبخند:

چون خود آرایه هم فارغ از اینکه عناصر داخلش new بشن خودش هم یک شی هست و باید new بشه. پس درستش به این صورته:
JLabel labels[] = new JLabel[30];
for (int i = 0; i < labels.length; i++) {
labels[i] = new JLabel(String.valueOf(i + 1));
}

cnmeysam
شنبه 13 آبان 1396, 13:33 عصر
سلام
کدی که من ساختم این شد و


JLabel lblSunday[] = new JLabel[5];
int sum = Integer.parseInt(a_letter);
for (int i=0;i< lblSunday.length;i++)
{
sum=sum+i;
lblSunday[i] = new JLabel(String.valueOf(i + 1));
lblSunday[i].setText(Integer.toString(sum)) ;
}


ولی باز هم توی لیبل هایی که ساختم خروجی نمایش داده نمیشه یعنی مقدار sum توش نمیاد متاسفانه
یعنی توی فرمم 5 تا لیبل هست که امشون اینه:
lblSunday1
lblSunday2
lblSunday3
lblSunday4
lblSunday5

vahid-p
شنبه 13 آبان 1396, 19:13 عصر
خب اون کدی که گفتم رو بذارید. شما یه بار در کانستراکتور i+1 رو گذاشتید ولی دوباره در خط بعدش اومدید setText زدید و مجموع یه سری عدد رو حساب کردید!!!
خود کانستراکتور وقتی به این صورت استفاده کنید، خودش مقدار رو میزنه. شما کلا اگر هیچی نمیبینید احتمالا layout رو ست نکردید و یا اون لیبل رو add نکردید.

لازمه مقدمات Swing رو بخونید: https://www.tutorialspoint.com/swing/index.htm

cnmeysam
شنبه 13 آبان 1396, 20:30 عصر
مگه وقتی توی فرم من لیبل رو ساختم و توی دستور میگم


lblSunday1.setText("1")


توی لیبل نمی نویسه 1؟
خب توی این حالتم آنالیز من از کد اینه که اعداد 1 تا 5 رو توی لیبل هایی که توی فرمم دارم باید بنویسه دیگه!
یعنی میشه



lblSunday1.setText("1")
lblSunday2.setText("2")
lblSunday3.setText("3")
lblSunday4.setText("4")
lblSunday5.setText("5")


که یعنی توی لیبلهایی که توی فرمم دارم باید اعداد 1 تا 5 نوشته بشه دیگه
یعنی لیبل 1 عدد 1 لیبل 2 عدد 2 همینجور تا آخر
یعنی آنالیزم از این کد و کل برنامه الان اشتباهه؟
اگه اشتباهه میشه بگید باید چیکار کنم که توی لیبل هایی که توی فرم قبل از کد نویسی ایجاد کردم اعدا 1 تا 5 نوشته بشه با استفاده از حلقه و آرایه منظورمه؟؟

vahid-p
شنبه 13 آبان 1396, 21:40 عصر
یه لحظه این عددها رو در نظر نگیرید. مشکل از این نیست. شما اول ببینید چند تا لیبل با هر متنی رو میتونید نشون بدید یا نه.

تمام کد کلاستون رو بذارید شاید مشکل از جای دیگه ای باشه

cnmeysam
شنبه 13 آبان 1396, 22:14 عصر
این کل کد باتنم





lblshamsi.setText(datePicker.getDate());
//بدست آوردن چندمین روز هفته
Calendar call = Calendar.getInstance();
int day = call.get(Calendar.DAY_OF_WEEK);
// if (day == 7){
// day =2;
// }
daynum.setText(Integer.toString(day));
//اگر بخواهیم روزهای زوج یا فرد را نمایش دهد
//int day = call.get(Calendar.DAY_OF_WEEK)+3;
int Even = day % 2 ;
lblnumberofday.setText(Integer.toString(Even));
if(Even ==0)
{
lblday.setText("فرد");
}else
{
lblday.setText("زوج");
}
switch (day) {
case 1:
englishdayname.setText("Sunday");
persiandayname.setText("یکشنبه");
break;
case 2:
englishdayname.setText("Monday");
persiandayname.setText("دوشنبه");
break;
case 3:
englishdayname.setText("Tuesday");
persiandayname.setText("سه شنبه");
break;
case 4:
englishdayname.setText("Wednesday");
persiandayname.setText("چهار شنبه");
break;
case 5:
englishdayname.setText("Thursday");
persiandayname.setText("پنج شنبه");
break;
case 6:
englishdayname.setText("Friday");
persiandayname.setText("جمعه");
break;
case 7:
englishdayname.setText("Saturday");
persiandayname.setText("شنبه");

}
zojfard();


//محاسبه تاریخ شمسی
String test = datePicker.getDate();

String a1 = Character.toString(test.charAt(0));
String a2 = Character.toString(test.charAt(1));
String a3 = Character.toString(test.charAt(2));
String a4 = Character.toString(test.charAt(3));
String a5 = Character.toString(test.charAt(4));
String a6 = Character.toString(test.charAt(5));
String a7 = Character.toString(test.charAt(6));
String a8 = Character.toString(test.charAt(7));
String a9 = Character.toString(test.charAt(8));
String a10 = Character.toString(test.charAt(9));

String a_letter = a9 + a10;



// JLabel lblSunday[] = new JLabel[5];
// for (int i = 0; i < lblSunday1.length; i++) {
// lblSunday1[i] = new JLabel(String.valueOf(i + 1));
// }


JLabel lblSunday[] = new JLabel[5];
int sum = Integer.parseInt(a_letter);
for (int i=0;i< lblSunday.length;i++)
{
sum=sum+i;
lblSunday[i] = new JLabel(String.valueOf(i + 1));
lblSunday[i].setText(Integer.toString(sum)) ;
}

jLabel1.setText(a1+a2+a3+a4+a5+a6+a7+a8+Integer.to String(sum));
//محاسبه تاریخ شمسی

String a = persiandayname.getText();
String b = Saturday.getText();
String c = Sunday.getText();
String d = Monday.getText();
String e = Tuesday.getText();
String f = Wednesday.getText();
String g = Thursday.getText();
String h = Friday.getText();

if( a==b)
{

lblSaturday1.setText(lblshamsi.getText());

}
if( a==c)
{
lblSaturday1.setEnabled(false);
lblSunday1.setText(lblshamsi.getText());

}
if( a==d)
{
lblSaturday1.setEnabled(false);
lblSunday1.setEnabled(false);
lblMonday1.setText(lblshamsi.getText());

}
if( a==e)
{
lblSaturday1.setEnabled(false);
lblSunday1.setEnabled(false);
lblMonday1.setEnabled(false);
lblTuesday1.setText(lblshamsi.getText());

}
if( a==f)
{
lblSaturday1.setEnabled(false);
lblSunday1.setEnabled(false);
lblMonday1.setEnabled(false);
lblTuesday1.setEnabled(false);
lblWednesday1.setText(lblshamsi.getText());

}
if( a==g){
lblSaturday1.setEnabled(false);
lblSunday1.setEnabled(false);
lblMonday1.setEnabled(false);
lblTuesday1.setEnabled(false);
lblWednesday1.setEnabled(false);
lblThursday1.setText(lblshamsi.getText());

}
if( a==h)
{
lblFriday1.setText(lblshamsi.getText());
lblSaturday1.setEnabled(false);
lblSunday1.setEnabled(false);
lblMonday1.setEnabled(false);
lblTuesday1.setEnabled(false);
lblWednesday1.setEnabled(false);
lblThursday1.setEnabled(false);
}





اینم کل پروژه تو ضمیمه گذاشتم اصل پروژه بازی با تاریخ هم شمسی هم میلادیه مثلا نمایش فقط روزهای زوج یا فرد توی یک ماه
http://cnmeysam.persiangig.com/dates.zip/download

vahid-p
یک شنبه 14 آبان 1396, 00:31 صبح
کدتون که درسته و جواب میده. متوجه نمیشم مشکلتون چیه. آرایه اینا هم نداشت. من گفته بودم کدی بدید که مشکل داشته باشه نه این! البته نمیخواد دوباره آپلود کنید.

اگر میخواید label دونه دونه تغییر بدید هم همون آرایه بگیرید و setText کنید درسته. اگر label از قبل وجود داره که دیگه نباید new کنید فقط setText کنید. شما صورت سوالتون با چیزی که میخواستید متفاوته.

ولی چون از Form Designer نت بینز استفاده میکنید هر label براش یک اسم جداگونه درست میکنه و به صورت آرایه نیست. پس باید برای چنین جاهایی خودتون کدش رو بنویسید و labelها رو به فرمتون add کنید.

یه چیزی شبیه به کد زیر (که البته ساده شدش هست):
package testam;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Main extends JFrame{
JLabel labels[];
JButton btn;
public Main(){
super();
setLayout(new FlowLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(700,300);

labels=new JLabel[30];
for(int i=0;i<labels.length;i++){
labels[i]=new JLabel("X");
add(labels[i]);
}
btn=new JButton("Count");
add(btn);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for(int i=0;i<labels.length;i++){
labels[i].setText(String.valueOf(i+1));
}
}
});
}

public static void main(String[] args) {
new Main().setVisible(true);
}
}

cnmeysam
یک شنبه 14 آبان 1396, 06:48 صبح
یعنی با این حساب باید بدون استفاده از محیط گرافیکی کل فرمم رو با کد نویسی توی یک کلاس درست کنم چیز زیاد سخت و پیچیده ای نیست ولی برای آدمای تنبلم خوب نیست:لبخند:
چون باید بشینم کل آبجکتها و محلشون و سایزشون رو با کد نویسی به فرم اضافه کنم:بامزه:
سوال آخر هیچ راهی نیست که وقتی با محیط گرافیکی فرم رو طراحی کنیم بشه خودکار با یه حلقه متن توی لیبل ها رو تغییر داد؟

vahid-p
یک شنبه 14 آبان 1396, 18:26 عصر
راه سر راست نه. ولی میتونید اسم متغیرها رو به عناصر آرایه در کل سورس کد تغییر بدید. که اینم با یک replace قابل انجامه.

cnmeysam
یک شنبه 14 آبان 1396, 18:29 عصر
سلام ممنون از راهنمایی ها و وقتی که گذاشتی
شرمنده اما میشه یه مثال بزنی؟

vahid-p
دوشنبه 15 آبان 1396, 10:55 صبح
مثال نداره دیگه. مثلا به جای lblSunday بذارید labels[0] یا مثلا به جای lblMonday بذارید labels[1] و... ولی باید آرایه labels رو تعریف کرده باشید و...

cnmeysam
دوشنبه 15 آبان 1396, 23:52 عصر
سلام
شرمنده متوجه نشدم یعنی وقتی یک چند لیبل دارم lblsunday1 و lblsunday2 و lblsunday3 و lblsunday4 و lblsunday5 توی فرمم حلقه و آرایم رو مثل این گذاشتم



JLabel lblSunday[] = new JLabel[5];
int sum = Integer.parseInt(a_letter);
for (int i=0;i< lblSunday.length;i++)
{
sum=sum+i;
lblSunday[i] = new JLabel(String.valueOf(i + 1));
lblSunday[i].setText(Integer.toString(sum)) ;
}




گفتم توی لیبل های توی فرمم مقدار sum چاپ بشه ولی انجام نمیشه متوجه نمیشم اشکال از کجاست میشه همین کد رو ویرایش کنید تا متوجه بشم جریان چیه؟
یعنی مقدار sum توی لیبل هایی که توی فرمم دارم چاپ بشه
یعنی لیبل 1 عدد مثلا 1 میشه لیبل 2 عدد 2 و الی آخر نمیخوام هم توی فرمم لیبل بذارم هم با کد بگم لیبل جدید به فرم اضافه کن میخوام همون لیبلی هایی که دارم مقدارش تغییر کنه

mostafa3dmax
چهارشنبه 17 آبان 1396, 22:48 عصر
اول یک آرایه از لیبل ها درست کن به این صورت

JLabel[] labels=new JLabel[] {lblsunday1,lblsunday2,lblsunday3,lblsunday4,lblsu nday5};

بعد برای تنظیم تکست هر کدوم توی حلق از این کد استفاده کن

for (int i=0;i<labels.length;i++){
labels[i].setText(String.valueOf(sum));
}