0

私は1つのJtableを持っており、列にレンダリングされた割り当てを割り当てています。ここで、特定のセルを 2 つの部分に分割して、2 つの値を提供できるようにしたいと考えています。分割は、Cellrenderer を介して行うことも、他の方法で行うこともできます。ここに画像の説明を入力

4

1 に答える 1

1

GridLayoutをセル レンダラーとして使用JPanelします。

public Component getTableCellRendererComponent(JTable table, Object value, 
  boolean isSelected, boolean hasFocus,int row,int col) {
    if (isSplitted(value) {
        JPanel panel = new JPanel(new GridLayout(1,2));
        JLabel left = new JLabel(getLeft(value));
        JLabel right = new JLabel(getRight(value));        
        panel.add(left);
        panel.add(right);    
        return panel; 
      } else {
        return super.getTableCellRendererComponent(
           table, value, isSelected, hasFocus, row, col)
      }
}  

ここgetLeftgetRightおよびisSplittedは、そのセルにレンダリングする値を定義するのはあなた次第です。

理にかなっている場合は、このパネルのインスタンスを 2 つのラベルで保持するように最適化することもできます。必要なコンテンツを設定すると、すべての呼び出しで再利用できます。左右のコンポーネントのサイズが大きく異なる場合は、BorderLayout の方が適切に機能する可能性があります。

同様に、セル エディターを提供することもできますが、必要なだけ編集することはできJTextFieldませJLabelん。AbstractCellEditorから派生し、(getCellEditorValueパネルから構成された値を返す) およびgetTableCellEditorComponent(フィールドを現在の値に設定した後にパネル自体を返す) をオーバーライドします。

@Stiflerが私の回答にコメントしました:

public Component getTableCellRendererComponent(JTable table, Object obj, 
    boolean isSelected,  boolean hasFocus, int row, int column) {
    Component cell = super.getTableCellRendererComponent(
      table, obj, isSelected, hasFocus, row, column);
    JPanel panel = new JPanel(new GridLayout(1, 2));
    if ("History".equals(obj)) {
        JTextField left = new JTextField("Left");
        left.setEditable(true);
        JTextField right = new JTextField("Right");
        left.setEditable(true);
        panel.add(left);
        panel.add(right);
        return panel;
    }
    return cell;
}  
于 2013-06-20T06:37:19.890 に答える