ورود

View Full Version : سوال: قرار دادن Border برای TableHeader



spiderman200700
سه شنبه 29 شهریور 1390, 02:17 صبح
سلام به دوستان خوبم.
من یه JTable دارم که میخوام وقتی روی TableHeaderش کلیک میکنم،یه Icon داخل Colum مورد نظر set بشه.
من LookAndFeel فریمم رو با کد زیر عوض کردم.
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (InstantiationException e) {
} catch (ClassNotFoundException e) {
} catch (UnsupportedLookAndFeelException e) {
} catch (IllegalAccessException e) {
}
که باعث شده Tableم شبیه این بشه:
75526


کد های مربوط به MouseٍEvent برای Table اینه:

table = new JTable(model);

table.setRowHeight(25);
table.setFont(new Font("tahoma", 1, 12));
table.getTableHeader().setFont(new Font("tahoma", 1, 15));
table.setBackground(new Color(255, 223, 180));
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setComponentOrientation(ComponentOrientation .RIGHT_TO_LEFT);

table.getTableHeader().addMouseListener(new MouseAdapter() {

@Override
public void mouseClicked(MouseEvent e) {


int colum = table.getTableHeader().columnAtPoint(e.getPoint()) ;
ImageIcon im = null;
im = new ImageIcon(Telephon.class.getResource("icons/up.png"));

SetIcon(colum, im, model.getColumnName(colum));

for (int i = 0; i < 10; i++) {
if (i == colum) {
continue;
}
SetIcon(i, null, table.getTableHeader().getColumnModel().getColumn( colum));
}

}
});

اینم متد SetIcon :
public void SetIcon(int col_index, ImageIcon icon, String name) {
table.getTableHeader().getColumnModel().getColumn( col_index).setHeaderRenderer(new iconRenderer());
table.getColumnModel().getColumn(col_index).setHea derValue(new txtIcon(name, icon));

}

اینم کلاس iconRenderer و txtIcon:

class iconRenderer extends DefaultTableCellRenderer {

public Component getTableCellRendererComponent(JTable table,
Object obj, boolean isSelected, boolean hasFocus, int row,
int column) {
txtIcon i = (txtIcon) obj;
if (obj == i) {
setText(i.text);
setFont(new Font("tahoma", 1, 15));
setIcon(i.imageIcon);

}

setBorder(UIManager.getBorder("Table.focusSelectedCellHighlightBorder"));
setHorizontalAlignment(JLabel.CENTER);
return this;
}
}


class txtIcon {

String text;
ImageIcon imageIcon;

txtIcon(String text, ImageIcon icon) {
this.text = text;
imageIcon = icon;
}
}


حالا مشکل اینه که وقتی من روی یکی از Columهای TableHeader کلیک میکنم تا یه Icon داخلش set بشه،Icon ست میشه،ولی Border مربوط به columها عوض میشه و شبیه به این میشه:
75527

من میخوام یه کاری کنم که بعد از کلیک بر روی Columها Border مربوط به اونا عوض نشه و مثل اول بمونه.
خودمو کشتم ، ولی نتونستم این کار رو بکنم.

اگه از دوستان کسی هست که این کار رو بلد باشه،لطفا کمکم کنه.
ممنون از همگی.

saeedIRHA
سه شنبه 29 شهریور 1390, 10:19 صبح
بخاطر اینکه Table ت Repaint می‌شه، کد مربوط به L&F رو در آخرین قسمت قرار بده ، یعنی‌ وقتی‌ Table ت رو customize کردی بعدش کد مربوط به L&F رو قرار بده :)

spiderman200700
سه شنبه 29 شهریور 1390, 22:57 عصر
ممنون از جوابتون.
Table در طول اجرای برنامه customize میشه و customize کردن Table در کلاس دیگه ای انجام میشه.
در هر صورت من ابن کار رو کردم ولی بازم مشکل حل نشد.

اگه برای این مشکل پیشنهاد دیگه ای دارید،لطف کنید و بهم بگید.
ممنون

saeedIRHA
چهارشنبه 30 شهریور 1390, 01:53 صبح
بعد از اینکه اعمال تغیرات کردی L&F رو دوباره ‌ست کن بعد فریم ت رو repaint و update کن، اگر نشد سورس کدت رو بذار اینجا که ببینم مشکل کجاست:
http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Container.html#validate%28%29
http://stackoverflow.com/questions/5147694/java-look-and-feel-changing-without-closing-window



//changing to Windows Style Fram
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(this); //=====> Repaint the whole Frame !!!!!!!
} catch (Exception e) {
System.err.println("Unable to change");
}

spiderman200700
شنبه 02 مهر 1390, 16:46 عصر
ممنون از کمکتون مشکلم حل شد.
خیلی لطف کردید.