باستخدام عمود فارغ كقسم في jtable
سؤال
أحاول استخدام عمود فارغ كقسم بين أزواج الأعمدة في أ JTable
. إليك صورة ورمز لما لدي حتى الآن. أعلم أنه يمكنني تغيير المظهر باستخدام العرف TableCellRenderer
. قبل أن أذهب إلى هذا الطريق ، هل هناك طريقة أفضل للقيام بذلك؟ أي أفكار موضع تقدير.
import javax.swing.*;
import javax.swing.table.*;
public class TablePanel extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("TablePanel");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.add(new TablePanel());
f.pack();
f.setVisible(true);
}
});
}
public TablePanel() {
TableModel dataModel = new MyModel();
JTable table = new JTable(dataModel);
table.getColumnModel().getColumn(MyModel.DIVIDER).setMaxWidth(0);
JScrollPane jsp = new JScrollPane(table);
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(jsp);
}
private static class MyModel extends AbstractTableModel {
private static final int DIVIDER = 2;
private final String[] names = { "A1", "A2", "", "B1", "B2" };
@Override
public int getRowCount() {
return 32;
}
@Override
public int getColumnCount() {
return names.length;
}
@Override
public String getColumnName(int col) {
if (col == DIVIDER) return "";
return names[col];
}
@Override
public Object getValueAt(int row, int col) {
if (col == DIVIDER) return "";
return (row + 1) / 10.0;
}
@Override
public Class<?> getColumnClass(int col) {
if (col == DIVIDER) return String.class;
return Number.class;
}
}
}
المحلول
حول مشكلة في هذا النهج ، سيحتاج المستخدم إلى "علامة التبويب" على عمود المقسم. يمكنك استخدام الجدول التبويب اقتراح لجعله أكثر سهولة في الاستخدام.
أو إذا لم يكن التبويب بين الجدولين أمرًا مهمًا ، فربما يمكنك استخدام جدولين ووضع أي مقسم تريده بين الاثنين. يمكن مشاركة نموذج التحديد إذا لزم الأمر.
تعديل:
كما اقترحت أعلاه مشاركة النماذج أسهل من كتابة المستمعين المخصصين. للحفاظ على التمرير في مزامنة الرمز سيكون:
jspa.getVerticalScrollBar().setModel( jspb.getVerticalScrollBar().getModel() );
يمكنك أيضًا القيام بنفس الشيء مع نموذج التحديد بحيث يكون تسليط الضوء على الصفوف متزامنًا.
نصائح أخرى
أنا نوع من الجمع بين الإجابات: لقد استخدمت جدولين يشتركان في شريط التمرير. هذا يعمل مع الفرز ، وهو في الواقع يجعل النموذج أكثر بساطة. لا يهم tabbing ، ولكن مقارنة "A" و "B". أعتقد أنني كنت أحاول حل مشكلة "عرض" في "النموذج". لقد جعلت هذا إجابة منفصلة ، لأنني أقدر أي تعليقات نقدية.
public TablePanel() {
this.setLayout(new GridLayout(1, 0, 8, 0));
JTable tableA = new JTable(new MyModel("A"));
tableA.setPreferredScrollableViewportSize(new Dimension(200, 400));
final JScrollPane jspA = new JScrollPane(tableA);
jspA.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
this.add(jspA);
JTable tableB = new JTable(new MyModel("B"));
tableB.setPreferredScrollableViewportSize(new Dimension(200, 400));
final JScrollPane jspB = new JScrollPane(tableB);
jspB.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(jspB);
tableA.setSelectionModel(tableB.getSelectionModel());
jspA.getVerticalScrollBar().setModel(jspB.getVerticalScrollBar().getModel());
}
دون معرفة ماذا تريد أن تظهر في هذا الجدول ، من الصعب معرفة ما إذا كنت قد حددت حلًا جيدًا أم لا.
بخصوص هذا الحل. هذا العمود لا يبدو مثل مقسم. قم برسمه باللون الرمادي/لون آخر ، أو خلية رأس مقسم للطلاء باللون الأبيض.
ولكن على أي حال كنت أفضل jscrollpane + جدولين بداخله بدلاً من هذا الحل.
يرجى إلقاء نظرة على إجابة هذا السؤال ، تم تقديم بعض الاقتراحات الجديدة اللطيفة هناك: مقسمات الأعمدة في jtable أو jxtable