1

JTableタイプに応じて列のセルをフォーマットするを実装しようとしています。これを実現するために、TableCellRenderer の「getTableCellRendererComponent()」メソッドを実装しています。

問題はgetTableCellRendererComponent()、コードのテスト出力がコンソールに表示されないため、メソッドが呼び出されないように見えることです。

レンダラーのコードは次のとおりです。

public class MenuSheetTableCellRenderer extends JLabel implements TableCellRenderer {

@Override
public Component getTableCellRendererComponent(
                        JTable table, Object value,
                        boolean isSelected, boolean hasFocus,
                        int row, int column){

JLabel label = new JLabel();

System.out.println("test");
if( value instanceof GregorianCalendar ){
    System.out.println("test2");
    GregorianCalendar timeGregorianCalendar = (GregorianCalendar) value;
    Date time = timeGregorianCalendar.getTime();
    SimpleDateFormat timeFormat = new SimpleDateFormat("hh:mm a");
    String mealTime = timeFormat.format(time);

    label.setText(mealTime);
}

else if( value instanceof MealChoice){
    label.setText(value.toString());
}   
else if( value instanceof Recipe){
    label.setText("     " + value.toString());
}
if (value instanceof String || value instanceof MealChoice){
    label.setFont(new Font("Tahoma", Font.BOLD, 11));
}

return label;
}

}

テーブルを生成するコード (関連コード用に編集) を次に示します。getRows() は、レンダリングするデータを返すカスタム メソッドであり、netbeans を使用していることにも注意してください (したがって、initComponents() メソッドを簡略化しています)。無関係であるべきです。

private void initComponents() {
menuSheetTable = new javax.swing.JTable();
menuSheetTable.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {

        },
        new String [] {

        }
    ));
    menuSheetTable.setEnabled(false);
    menuSheetTable.setFocusable(false);
    menuSheetTable.setShowHorizontalLines(false);
    menuSheetTable.setShowVerticalLines(false);
    jScrollPane1.setViewportView(menuSheetTable);
}

public void renderTable(){

String[] columns = { "Sunday", "Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; 
Object[][] rows = getRows();

DefaultTableModel menuSheetModel = new DefaultTableModel( rows, columns );
menuSheetTable.setModel( menuSheetModel );

MenuSheetTableCellRenderer renderer = new MenuSheetTableCellRenderer();
try{
   menuSheetTable.setDefaultRenderer(Class.forName("java.lang.String"), renderer);
   menuSheetTable.setDefaultRenderer(Class.forName("java.util.GregorianCalendar"), renderer); 
   menuSheetTable.setDefaultRenderer(Class.forName("MenuSystemManager.MealChoice"), renderer);
   menuSheetTable.setDefaultRenderer(Class.forName("MenuSystemManager.Recipe"), renderer);
}
catch( ClassNotFoundException e){
    System.exit(1);
}
}
4

2 に答える 2

2

Objectデフォルトのレンダラーを設定するコードには、オブジェクトが登録されていません。rows[][]は型「Object」を保持するように宣言されていたため、s、s、または s ではなくオブジェクトが渡されたため、レンダラーは呼び出されませんでしObjectた。GregorianCalendarStringRecipe

于 2013-08-07T14:00:25.243 に答える
0

私は同じ問題に遭遇しました。さて、あなたはそれがこのように振る舞う理由をすでに見つけました。だから、ここに解決策があります。

JTableTableModel保持するデータに関するすべての情報をテーブルに提供するインターフェイスで動作します。この情報には、列に関連付けられたクラスも含まれます。したがって、基本的に、テーブルのデータを保持し、メソッドをオーバーライドするクラスを派生させるTableModelか、クラスを使用する必要があります。その機能強化の後、カスタムを使用できます。あなたのコードでは、任意の列に対して返される を指定したため、うまくいきませんでした。AbstractTableModelpublic Class<?> getColumnClass(int columnIndex)TableCellRendererJTableDefaultTableModelObject

于 2016-12-14T01:53:23.203 に答える