21 Ağustos 1999 Cumartesi 10:00:00 UTC+3 tarihinde Chris Gow yazdı:
> Hi All:
>
> Can anyone point me to any code, or samples that show how I would merge
> a number of cells in a JTable together?
>
> Thanks in Advance
>
> Chris Gow
>
g...@ocas.on.ca
Merhaba!
Aşağıda verececeğim satır tabanlı hücre birleştirme yapan kod belki işine yarar.
Bu kodu günlerce uğraşarak ayarlayabildim.
kolay gelsin.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.plaf.basic.BasicTableUI;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import com.sun.java.swing.plaf.nimbus.TableEditorPainter;
public class hücre_birleştirme_8_1 {
JScrollPane jKayanPencere;
static int k=0;
static JTable jTablo;
static void Bileşenleri_Ayarla(){
JFrame İletişim_Kutusu = new JFrame("Hücreleri Birleştir");
İletişim_Kutusu.setSize(450, 300);
İletişim_Kutusu.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // DISPOSE_ON_CLOSE: Sadece etkin penceriyi kapatacak şekilde ayarla.
Container Taşıyıcı = İletişim_Kutusu.getContentPane();
İletişim_Kutusu.setLocationByPlatform(true);
// İletişim nesnelerini tanımla ve ayarla.
jTablo=new GenişletilmişTablo(new DefaultTableModel(7, 4));
jTablo.setCellSelectionEnabled(true);
jTablo.setPreferredScrollableViewportSize(new Dimension(430,250));
JScrollPane jKayanPencere=new JScrollPane(jTablo);
Taşıyıcı.add(jKayanPencere, BorderLayout.CENTER);
İletişim_Kutusu.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
İletişim_Kutusu.setVisible(true);
}
public static void main(String[] args) {
//Programı olay gönderme kanalında çalıştır.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
Bileşenleri_Ayarla();
}
});
}
}
class GenişletilmişTablo extends JTable {
protected static int StrSay;
protected static int StnSay;
public GenişletilmişTablo (TableModel bicim){
super(bicim); //Tablo biçimini tanımla.
setUI(new HucreGenisletmeAY()); //Genişletilmiş UI sınıfını belirle.
setRowHeight(25);
setRowHeight(0,45);
setRowMargin(2);
getColumnModel().setColumnMargin(2);
setGridColor(Color.blue);
StrSay=super.getRowCount();
StnSay=super.getColumnCount();
}
//JTable sınıfının getCellRect yöntemini devredışı bırakarak yeniden düzenle.
//Tablo biçimi tanımlandığında kendiliğinden çalışmaktadır.
public Rectangle getCellRect(int str, int stn, boolean kapsam){
Rectangle dortgen;
if ((str<0)||(stn<0)||(getRowCount()<=str)||(getColumnCount()<=stn)){
return dortgen=super.getCellRect(str, stn, kapsam);
}
int es=Etkin_Sütun(str,stn);
dortgen=super.getCellRect(str, es, kapsam);
if (Genişletici(str,es)!=-1){
for (int j=1; j<Genişletici(str,es); j++){
dortgen.width+=getColumnModel().getColumn(es+j).getWidth();
}
}
return dortgen;
}
//Birleşik hücre bölgesini etkinleştiren başlangıç sütun sırasını belirleme yöntemi.
public int Etkin_Sütun(int str, int stn){
if ((str==0)&&(stn>=0)&&(stn<=2)) return 0;
if ((str==1)&&(stn>=1)&&(stn<=2)) return 1;
return stn;
}
//Birleştirilecek hücrelerin başlangıç satır sırasını ve sütun sayılarını belirleme yöntemi.
public int Genişletici(int str, int stn){
if ((str==0)&&(stn==0)) return 3;
if ((str==1)&&(stn==1)) return 2;
return -1;
}
}
class HucreGenisletmeAY extends BasicTableUI {
//BasicTableUI sınıfının paint yöntemini devredışı bırakarak yeniden düzenle.
//Bu yöntemin adı "paint" olmak zorundadır.
public void paint(Graphics g, JComponent c){
Rectangle kesimBoyutlari=g.getClipBounds();
int ilkSatır=table.rowAtPoint(new Point(0, kesimBoyutlari.y));
int sonSatır=table.rowAtPoint(new Point(0, kesimBoyutlari.y+kesimBoyutlari.height));
if (sonSatır<0) sonSatır=table.getRowCount()-1;
for (int i=ilkSatır; i<=sonSatır; i++){
satır_boya(g,i);
}
}
private void satır_boya(Graphics g, int str){
Rectangle dortgen=g.getClipBounds();
for (int j=0; j<table.getColumnCount(); j++){
Rectangle hucreDortgeni=table.getCellRect(str, j, true);
if (hucreDortgeni.intersects(dortgen)){
hucre_boya(g, hucreDortgeni, str, j);
}
}
}
private void hucre_boya(Graphics g, Rectangle boyaAlanı, int str, int stn){
int ArlY=table.getRowMargin();
int ArlX=table.getColumnModel().getColumnMargin();
Color r=g.getColor();
g.setColor(Color.green);
g.drawRect(boyaAlanı.x, boyaAlanı.y, boyaAlanı.width-ArlY, boyaAlanı.height-ArlX);
//g.setColor(Color.blue);
//g.fillRect(boyaAlanı.x+ArlX/2, boyaAlanı.y+ArlY/2, boyaAlanı.width-2*ArlY, boyaAlanı.height-2*ArlX);
boyaAlanı.setBounds(boyaAlanı.x+ArlX/2, boyaAlanı.y+ArlY/2, boyaAlanı.width-ArlX, boyaAlanı.height-ArlY);
if (table.isEditing() && table.getEditingRow()==str &&
table.getEditingColumn()==stn){
Component Bileşen=table.getEditorComponent();
Bileşen.setBounds(boyaAlanı);
Bileşen.validate();
}
else{
TableCellRenderer Görüntüleyici=table.getCellRenderer(str, stn); //Hücre işleyicisini tanımla.
Component Bileşen = table.prepareRenderer(Görüntüleyici, str, stn); //İşleyiciyi hazırla.
if (Bileşen.getParent()==null) rendererPane.add(Bileşen);
rendererPane.paintComponent(g, Bileşen, table, boyaAlanı.x, boyaAlanı.y,
boyaAlanı.width, boyaAlanı.height, true);
}
}
}