PDA

View Full Version : JTabbedPane



yegane8
شنبه 21 مرداد 1391, 03:34 صبح
سلام
تویه یک کلاس یک JTabbedPane دارم در add کردن tab ها به JTabbedPane دچار مشکل شدم
JPanel p0= new JPanel();
final JTabbedPane jtp = new JTabbedPane();
jtp.addTab("name 1",p0);
jtp.addTab("name 2",p0);


این panel p0 در یک متد return می شود و در طول برنامه تغییر می کند اما فقط یک tab به نمایش در می اید
مشکل از کجاست؟
باتشکر

spiderman200700
شنبه 21 مرداد 1391, 12:17 عصر
سلام.
یعنی در اینجا p0 اول با p0 دوم فرق داره؟اگه آره کدهایی که باعث تغییر p0 میشه رو اینجا بذار.
در کل بیشتر توضیح بده که مشکل چیه

yegane8
شنبه 21 مرداد 1391, 21:59 عصر
چون یه جورایی کل این کلاس درگیر این کارند کلش رو میزارم
توضیحات : من می خواهم کاربر با زدن هر کدوم از tab ها index اوون tab برگرده و با توجه به اوون index اسم فایل مورد نظر از arrayList title مشخص میشه و در قسمت readFile از اوون اسم استفاده میشه اما فقط یک tab به نمایش درمی اد و اصلا کار به جایی نمی کشه که کاربر بخواد یکی از tab ها رو انتخاب کنه !
به جای p0 که یه panel معمولیه از JsplitPane استفاده کردم
import java.awt.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.*;
import javax.swing.event.*;


public class converstion {

private JPanel panel1;
private JPanel panel2;
private JSplitPane jSplitPane;
private ArrayList title;
private int index;
public converstion() throws FileNotFoundException{
title = new ArrayList();

fillTitle();
fillSplitPane();
// setTab();

}


private void setTab(Container splitPane) throws FileNotFoundException{

JPanel p0= new JPanel();
final JTabbedPane jtp = new JTabbedPane();

jtp.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
// System.out.println("tabIndex="+jtp.getSelectedIndex());
int tabIndex = jtp.getSelectedIndex();
setIndex(tabIndex);

}


});
jtp.addTab("name1",splitPane);

jtp.addTab("name 2",splitPane);


JFrame frame = new JFrame();
Container cp = frame.getContentPane();
cp.add(jtp);

frame.pack();
frame.setDefaultCloseOperation(firstFrame.DISPOSE_ ON_CLOSE);

frame.setVisible(true);
}


private void fillSplitPane() throws FileNotFoundException {
panel1 = readFile1();
panel2 = readFile2();



jSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,panel2, panel1);
jSplitPane.setContinuousLayout(true);
jSplitPane.setBackground(Color.white);
setTab(jSplitPane);


}

private void fillTitle() {

title.add("utf.txt");
title.add("ut.txt");
title.add("bus.txt");
title.add("busP.txt");
}

private JPanel readFile1() throws FileNotFoundException {
JPanel panel = new JPanel(new FlowLayout());
BoxLayout boxlayout = new BoxLayout(panel, BoxLayout.Y_AXIS);
panel.setLayout(boxlayout);
String t = (String) title.get(getIndex());
Scanner read =new Scanner(new File(t));
String line1;

while(read.hasNextLine()){
line1 = read.nextLine();
JLabel label = new JLabel(line1);
panel.add(label);
}
return panel;

}
private JPanel readFile2() throws FileNotFoundException{
JPanel panel = new JPanel(new FlowLayout());
BoxLayout boxlayout = new BoxLayout(panel, BoxLayout.Y_AXIS);
panel.setLayout(boxlayout);
String t = (String) title.get(getIndex()+1);
Scanner read =new Scanner(new File(t));
String line1;

while(read.hasNextLine()){
line1 = read.nextLine();
JLabel label = new JLabel(line1);
panel.add(label);
}
return panel;
}

private void setIndex(int tabIndex) {

index = tabIndex;

}
private int getIndex(){
return index;
}

}

spiderman200700
شنبه 21 مرداد 1391, 22:18 عصر
اگه مشکلتون اینه که قط یه tab نشون داده میشه، مشکل از خط 42 و 44 هست.
jtp.addTab("name1",splitPane);

jtp.addTab("name 2",splitPane);
شما اومدی یه object رو دوبار به JTabbedPane اضافه کردی. این کار اشتباهه. باید دوتا Object مختلف رو ادد کنی تا درست بشه. یعنی هر tab باید شامل Object های مختلفی باشه.

yegane8
شنبه 21 مرداد 1391, 22:48 عصر
یعنی باید واسه هر tab یک ارگومان جدا بفرستم؟
من این کار رو کردم تا واسه هر tab نخوام یک jsplitPane درست کنم و واسه هر tab حدود 50 خط تکراری اضافه کنم
احساس می کنم باید از یه تابع بازگشتی یا یه هم چین چیزی استفاده کنم
درست نمی دونم باید چی کار کنم واسه این مشکل:متفکر:

spiderman200700
شنبه 21 مرداد 1391, 23:55 عصر
چرا 50 خط تکراری؟!
شما میخوای هر بار که یه تب انتخاب میشه با توجه به ایندکس تب فایلی با اون ایندکس در آرایه ی نامهای فایل خونده بشه و محتویاتش داخل JSplitPaneی که داخل تب انتخاب شده قرار داره نمایش داده بشه.
اگه ان چیزی که گفتم همون چیزی باشه که شما میخوای ، کدهای تکراری لازم نیست. باید یه متد بنویسی که هر بار که یه تب انتخاب میشه ، اینکس تب و JSplitPane داخل اون تب رو بگیره ، بعدش فایل متناسب با اون تب رو بخونه و داخل JSplitPane بریزه و JSplitPane رو برگردونه.
فقط یه متد میخواد.

اگه چیزی که گفتم خواسته ی شما نیست ، پس فکر کنم باید بازم بیشتر توضیح بدی !

yegane8
یک شنبه 22 مرداد 1391, 00:18 صبح
این دقیقا همون چیزیه که من می خوام
یعنی اول باید به تعداد tab هایی که دارم jsplitPane تعریف کنم ؟ تا کاربر بتونه یه tab رو انتخاب کنه

باید یه متد بنویسی که هر بار که یه تب انتخاب میشه ، اینکس تب و JSplitPane داخل اون تب رو بگیره ،
یه سوال برام پیش اوومد که وقتی دارم tab ها رو add می کنم : jtp.addTab("name1",splitPane);

بعدش فایل متناسب با اون تب رو بخونه و داخل JSplitPane بریزه و JSplitPane رو برگردونه.
بعد چطوری این jsplitPane رو ازش استفاده کنم اخه دیگه من که tab رو add کردم و یه بار splitPane رو بهش پاس دادم:متفکر:

spiderman200700
یک شنبه 22 مرداد 1391, 04:43 صبح
بله . باید اول تمام تب ها رو add کنی.
بعدا هم میتونی با متد های getRightComponent و getLeftComponent مربوط به JSplitPane به کامپوننتهای داخلش دسترسی داشته باشی و هز کاری که میخوای انجام بدی.
برای دسترسی به خود JSplitPaneها هم باید از متد های getTabComponentAt که داخل JTabbedPane قرار داره استفاده کنی. این متد ایندکس رو میگیره و JSplitPane داخل اون تب رو به صورت یه شی Component بهت میده.
اینا کارای راحتیه با نیم ساعت بررسی کردن و یه کم آزمون و خطا 10 برابر این چیزی که گفتم رو از اکثر کامپوننت ها میفهمی. در مرحله ی یادگیری یه چیز توی برنامه نویسی آزمون و خطا قسمت جدا نشدنیه کاره. :لبخندساده:

yegane8
یک شنبه 22 مرداد 1391, 06:20 صبح
خیلی ممنون از راهنمایی تون
من یکسری از کار هایی که گفتید رو انجام دادم ولی حالا با زدن روی هر tab یه tab دیگه اضافه می شه
مشکل دوم : بعد از این که چند بار روی tab های ایجاد شده می زنم یکی از اوون همه tab ی درست شده میشه همون tab اولی که من می خوام
مشکل سوم : اصلا tab 2 درست نمیشه و از فایل هایی که در ارایه ی title عنوان شون در عنصر 3 و 4 هستند خونده نمی شن (یعنی فقط فایل هایی که در title عنصر 1و 2 اند خونده می شن که منجر به درست شدن فقط tab اول میشن)
برنامه تغییر یافته :
import java.awt.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.*;
import javax.swing.event.*;


public class converstion {

private JPanel panel1;
private JPanel panel2;
private JSplitPane jSplitPane;
private ArrayList title;
private int index;
public converstion() throws FileNotFoundException{
title = new ArrayList();

fillTitle();
setTab();

}


private void setTab() throws FileNotFoundException{

final JTabbedPane jtp = new JTabbedPane();
JSplitPane splitPane1 = new JSplitPane();
JSplitPane splitPane2 = new JSplitPane();
final JSplitPane splitPane3 = new JSplitPane();
jtp.addTab("name1",splitPane1);
jtp.addTab("name 2",splitPane2);
jtp.addTab("name 3",splitPane3);



jtp.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
System.out.println("tabIndex="+jtp.getSelectedIndex());
int tabIndex = jtp.getSelectedIndex();
try {
setIndexAndSplitPane(tabIndex, jtp.getTabComponentAt(tabIndex));
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
jtp.addTab("name1",getSplitPan());
jtp.addTab("name 2",getSplitPan());
jtp.addTab("name 3",splitPane3);



}

});


JFrame frame = new JFrame();
Container cp = frame.getContentPane();
cp.add(jtp);

frame.pack();
frame.setDefaultCloseOperation(firstFrame.DISPOSE_ ON_CLOSE);

frame.setVisible(true);
}


private JSplitPane fillSplitPane() throws FileNotFoundException {
panel1 = readFile1();
panel2 = readFile2();
jSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,panel2, panel1);
jSplitPane.setContinuousLayout(true);
jSplitPane.setBackground(Color.white);
return jSplitPane;

}

private void fillTitle() {

title.add("utf.txt");
title.add("ut.txt");
title.add("bus.txt");
title.add("busP.txt");
}

private JPanel readFile1() throws FileNotFoundException {
JPanel panel = new JPanel(new FlowLayout());
BoxLayout boxlayout = new BoxLayout(panel, BoxLayout.Y_AXIS);
panel.setLayout(boxlayout);
String t = (String) title.get(getIndex());
Scanner read =new Scanner(new File(t));
String line1;

while(read.hasNextLine()){
line1 = read.nextLine();
JLabel label = new JLabel(line1);
panel.add(label);
}
return panel;

}
private JPanel readFile2() throws FileNotFoundException{
JPanel panel = new JPanel(new FlowLayout());
BoxLayout boxlayout = new BoxLayout(panel, BoxLayout.Y_AXIS);
panel.setLayout(boxlayout);
String t = (String) title.get(getIndex()+1);
Scanner read =new Scanner(new File(t));
String line1;

while(read.hasNextLine()){
line1 = read.nextLine();
JLabel label = new JLabel(line1);
panel.add(label);
}
return panel;
}

private void setIndexAndSplitPane(int tabIndex,Component splitPane) throws FileNotFoundException {

index = tabIndex;

splitPane = fillSplitPane();
jSplitPane = (JSplitPane) splitPane;
}


private int getIndex(){
return index;
}
private JSplitPane getSplitPan(){
return jSplitPane;
}
}

مشکل از کجا هاست ؟:متفکر:
باتشکر

yegane8
یک شنبه 22 مرداد 1391, 12:40 عصر
الان فکر کردم شاید به خاطر اینکه خط 48-51 :
jtp.addTab("name1",getSplitPan());
jtp.addTab("name 2",getSplitPan());
jtp.addTab("name 3",splitPane3);

داخل jtp.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {

اند این مشکل به وجود می اید ولی وقتی تغییر دادم به جای اینکه همون tab ها یی که اول add کرده بودم تغییر کنند 5 تا tab به وجود اوومدند که تو 3 تاش هیچی نیست و 2 تا اخری ها هم که اصلا نمی شه انتخاب شون کرد
مشکل من اینه که من نمی خوام به تعداد tab هام اضافه شه من می خوام اوون 3 تا tab ی که اول add کردم JSplitPane دلخواه توشون قرار بگیره :متفکر:
لطفا راهنمایی کنید :]
یکبارم خط 32و33 : jtp.addTab("name1",splitPane1);
jtp.addTab("name 2",splitPane2);
j
رو حذف کردم اما محتویات JSplitPane در tab1 با tab 2 هیچ فرقی نداشت اما نمی دونم چرا ؟!

spiderman200700
یک شنبه 22 مرداد 1391, 13:34 عصر
من قبل از این که چیزی بگم باید بپرسم که:
چرا میخوای وقتی روی یه تب کلیک شد دوتا فایل خونده بشه و داخل یه JSplitPane قرار بگیره؟ اینجوری مدیریت تب ها سخت میشه. چرا برای هر JSplitPane یه فایل در نظر نمیگیری؟
و آیا قراره به تعداد تب ها در طول اجرای برنامه اضافه بشه؟

yegane8
دوشنبه 23 مرداد 1391, 02:46 صبح
چرا برای هر JSplitPane یه فایل در نظر نمیگیری؟
اخه واسه هر JSplitPane متفاوته باید چند خط از یک فایل رو تو panel بالا و چند خط از همون فایل رو تو panel پایین قرار بدم
یه تغییر تو برنامه دادم که 2 تا arrayList گرفتم که اسم فایلی که قراره تو panel1 خونده بشه تو title1 و اسم فایلی که قراره تو panel2 ریخته بشه تو title2 هستند تا با index یک تب بتونم 2 تا فایل رو بخونم و index تب ها قاطی نشه

و آیا قراره به تعداد تب ها در طول اجرای برنامه اضافه بشه؟
نه در طول برنامه tab ی اضافه نمی شه ولی همون tab هایی که اول add میشن تعدادشون زیاده

yegane8
دوشنبه 23 مرداد 1391, 22:17 عصر
لطفا راهنمایی کنید کارم گیره همین تیکه ست :گریه:

spiderman200700
سه شنبه 24 مرداد 1391, 00:44 صبح
خب اگه قرار نیست تعداد تب ها زیاد بشه، خیلی کارت راحته.
کافیه توی متد سازنده ی کلاس بیای تمام فایل هاتو بخونی و بریزی توی JSplitPane و به JFrame اضافه کنی دیگه.
مشکلت با این کارایی که گفتم چیه دقیقا؟
اگه میشه کد جدیدتم اینجا بذار

yegane8
سه شنبه 24 مرداد 1391, 01:06 صبح
مشکلم اینه که الان اولا یه بار باید tab دوم رو انتخاب کنم تا فایل خونده بشه
دوما فقط فایل اول خونده میشه و توی هم tab 1 هم tab2 اوون JSplitPane مربوط به tab1 قرار داده میشه
احساس میکنم باید این تیکه از برنامه هر دفعه که یه tab جدید اضافه میشه تکرار شه اما دقیقا نمی دونم کجا:متفکر:
jtp.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
System.out.println("tabIndex="+jtp.getSelectedIndex());
int tabIndex = jtp.getSelectedIndex();
try {
setIndexAndSplitPane(tabIndex, jtp.getTabComponentAt(tabIndex));
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
}

});


برنامه تغییر یافته :
import java.awt.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.*;
import javax.swing.event.*;


public class converstion {

private JPanel panel1;
private JPanel panel2;
private JSplitPane jSplitPane;
private ArrayList title1;// title for panel1
private ArrayList title2;//title for panel2
private int index;
public converstion() throws FileNotFoundException{
title1 = new ArrayList();
title2 = new ArrayList();
fillTitle1();//fill title for panel 1
fillTitle2();//fill title for panel 2
setTab();

}


private void setTab() throws FileNotFoundException{

final JTabbedPane jtp = new JTabbedPane();
JSplitPane splitPane1 = new JSplitPane();
JSplitPane splitPane2 = new JSplitPane();
final JSplitPane splitPane3 = new JSplitPane();
jtp.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
System.out.println("tabIndex="+jtp.getSelectedIndex());
int tabIndex = jtp.getSelectedIndex();
try {
setIndexAndSplitPane(tabIndex, jtp.getTabComponentAt(tabIndex));
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
}

});
jtp.addTab("name1",getSplitPan());
jtp.addTab("name 2",getSplitPan());
jtp.addTab("name 3",splitPane3);





JFrame frame = new JFrame();
Container cp = frame.getContentPane();
cp.add(jtp);

frame.pack();
frame.setDefaultCloseOperation(firstFrame.DISPOSE_ ON_CLOSE);

frame.setVisible(true);
}


private JSplitPane fillSplitPane() throws FileNotFoundException {
panel1 = readFile1();
panel2 = readFile2();
jSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,panel2, panel1);
jSplitPane.setContinuousLayout(true);
jSplitPane.setBackground(Color.white);
return jSplitPane;

}

private void fillTitle1() {

title1.add("utf.txt");
title1.add("bus.txt");
}

private void fillTitle2() {


title2.add("ut.txt");
title2.add("busP.txt");
}


private JPanel readFile1() throws FileNotFoundException {
JPanel panel = new JPanel(new FlowLayout());
BoxLayout boxlayout = new BoxLayout(panel, BoxLayout.Y_AXIS);
panel.setLayout(boxlayout);
String t = (String) title1.get(getIndex());
Scanner read =new Scanner(new File(t));
String line1;

while(read.hasNextLine()){
line1 = read.nextLine();
JLabel label = new JLabel(line1);
panel.add(label);
}
return panel;

}
private JPanel readFile2() throws FileNotFoundException{
JPanel panel = new JPanel(new FlowLayout());
BoxLayout boxlayout = new BoxLayout(panel, BoxLayout.Y_AXIS);
panel.setLayout(boxlayout);
String t = (String) title2.get(getIndex());
Scanner read =new Scanner(new File(t));
String line1;

while(read.hasNextLine()){
line1 = read.nextLine();
JLabel label = new JLabel(line1);
panel.add(label);
}
return panel;
}

private void setIndexAndSplitPane(int tabIndex,Component splitPane) throws FileNotFoundException {

index = tabIndex;

splitPane = fillSplitPane();
jSplitPane = (JSplitPane) splitPane;
}


private int getIndex(){
return index;
}
private JSplitPane getSplitPan(){
return jSplitPane;
}
}

باتشکر

spiderman200700
سه شنبه 24 مرداد 1391, 01:40 صبح
من به جای این برنامه ی شما ، برنامه ی زیر رو نوشتم.
ببین همونیه که میخوای.
فکر کنم همونه که با یه ذره تغییر میتونی همون چیزیش کنی که دقیقا انتظار داری.

import java.awt.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import javax.swing.*;
import javax.swing.event.*;

public class converstion extends JFrame {

private int index;
private JTabbedPane jtp;

public converstion() throws FileNotFoundException {
super("Files");
setSize(600, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
jtp = new JTabbedPane();
jtp.addChangeListener(new ChangeListener() {

@Override
public void stateChanged(ChangeEvent e) {
index = jtp.getSelectedIndex();
System.out.println(index);
}
});
addSplitPanes();
add(jtp);

}

private void addSplitPanes() {
for (int i = 0; i < 3; i++) {
try {
JScrollPane jsp1 = new JScrollPane(readFile("file" + i + "1.txt"));
JScrollPane jsp2 = new JScrollPane(readFile("file" + i + "2.txt"));
jtp.addTab("tabe" + i, new JSplitPane(JSplitPane.VERTICAL_SPLIT, jsp1, jsp2));
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
}
}

private JPanel readFile(String fileName) throws FileNotFoundException {
JPanel panel = new JPanel(new FlowLayout());
BoxLayout boxlayout = new BoxLayout(panel, BoxLayout.Y_AXIS);
panel.setLayout(boxlayout);
Scanner read = new Scanner(new File(fileName));
while (read.hasNextLine()) {
panel.add(new JLabel(read.nextLine()));
}
return panel;

}

private int getIndex() {
return index;
}

public static void main(String args[]) {
try {
new converstion().setVisible(true);
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
}
}
باید این شش فایل رو داشته باشی:
file01.txt
file02.txt
file11.txt
file12.txt
file21.txt
file22.txt

سوالی در موردش داشتی بپرس

yegane8
سه شنبه 24 مرداد 1391, 02:33 صبح
واقعا ممنون :لبخندساده:
همونطور که خودتون گفتید یه خورده تغییرش دادم همونی شد که می خواستم
به صورت کلی همیشه گرفتن یه ارایه از یه object که توش 2 تا string هست به جای گرفتن 2 تا ارایه از string بهتره?
چون به نظرم این نکته تو کد شما باعث کوتاه شدن و قابل فهم تر شدن کد شده بود
و یه سوال کلی دیگه : از کجا باید بفهمم که چه زمانی باید یه کلاس از کلاس JFrame ارث ببره یا از JPanel ؟(سوال ام در مورد همین 2 تا کلاسه در مورد مفهوم ارث بری نیست البته فرق JFrame و JPanel رو می دونم)
باتشکر

spiderman200700
سه شنبه 24 مرداد 1391, 04:56 صبح
خواهش میکنم.
بله درسته بیشتر مواقع نگهداشتن دوتا String در یه شی بهتره از نگهداری توی دوتا آرایه ی مختلفه. البته این به نیازت بستگی داره.
البته من برنامه رو یه تغییر دادم که خودت میتونی ببینی.

در مورد JFrame و JPanel هم باید بگم که. JPanel همونطور که از اسمشم معلومه یه Panel هست. یعنی به شما یه Window نشون نمیده و فقط میتونی روش چندین کامپوننت بچینی و خود این JPanel رو درنهایت روی یه Window که همون JFrame باشه ، نشون بدی.
ولی JFrame چون از مشتقات Window هست و رابط WindowConstants رو هم پیاده سازی کرده، علاوه بر این که میتونی روش کامپوننت ها رو بچینی ، میتونه واست یه Window نشون بده. یعنی یه پنجره ی قابل دیدن.
پس هر موقع خواستی یه JPanel سفارشی بسازی کلاست باید از JPanel مشتق بشه و با ساخت شی از این کلاس سفارشی و اضافه کردنش به یه JFrame ،یا کلاسی که از JFrame مشتق شده ، میتونی نمایشش بدی.
با توجه به این چیزایی که گفتم ، دستت بازه که حتی همزمان دو تا کلاس داشته باشی که یکیش از JFrame و یکی دیگه از JPanel مشتق شده.
بعد با ساخت شی از کلاسی که از JPanel مشتق شده و add کردنش به کلاسی که از JFrame مشتق شده، کلاس اول رو(کلاسی که از JPanel مشتق شده) توی پنجره نشون بدی .
امیدوارم موفق باشی