1 столбец JTable для 2 параметров данных

У меня есть DefaultTableModel, настроенный так

String[] columns = { "Username", "Group", "Kick", "Ban" };
Object[][] data = { { "Name1", "Owner", "Kick", "Ban" }, { "Name2", "Admin", "Kick", "Ban" } };

DefaultTableModel dm = new DefaultTableModel(data, columns);

Я хотел бы иметь только 1 большой столбец с именем «Параметры» для «Кик» и «Бан». Как мне это сделать?


person user3879542    schedule 04.08.2014    source источник
comment
stackoverflow.com/questions/11665397/   -  person Joop Eggen    schedule 04.08.2014
comment
на 1-й вопрос - возможно, но не делайте этого с JTableHeader, используйте JComponents, размещенные вне JScrollPane, прослушиваемые TableColumnModelListener, тогда 2-й вопрос может быть неуместным   -  person mKorbel    schedule 04.08.2014
comment
Второй вопрос не имеет значения, да, но я подумал, что задам его одновременно, а не задам новый вопрос. Я могу удалить его после того, как получу ответ на него.   -  person user3879542    schedule 04.08.2014
comment
Для вашего первого вопроса, пожалуйста, взгляните на это: community.oracle.com/thread /1354625?start=0&tstart=0. А для второго вопроса просто сделайте: table.getTableHeader().setResizingAllowed(false);   -  person blackbishop    schedule 04.08.2014


Ответы (2)


Вы можете отключить изменение размера столбца:

table.getTableHeader().setResizingAllowed(false);
person icza    schedule 04.08.2014

Вы не можете использовать DefaultTableModel для этого. Вы должны создать свою собственную модель таблицы, которая расширяет Java DefaultTableModel. Вот пример, который вы можете адаптировать для своих целей.

public class SplitCellsExample extends JFrame
{
 // data is Vector of Vector... each inner Vector (i.e. each record) 
 // has values of Object[2] representing a split cell value
// and each element of Object[2] has half of the cell value
Vector data;
JTable table;

public SplitCellsExample()
{
    super();

    data = createData();

    SplitCellTableModel model = new SplitCellTableModel();
    table = new JTable(model);
    table.getColumnModel().getColumn(0).setCellEditor(new SplitTableCellEditor());
    table.getColumnModel().getColumn(1).setCellEditor(new SplitTableCellEditor());
    table.getColumnModel().getColumn(0).setCellRenderer(new SplitTableCellRenderer());
    table.getColumnModel().getColumn(1).setCellRenderer(new SplitTableCellRenderer());
    JScrollPane scroller = new JScrollPane(table);
    getContentPane().setLayout(new BorderLayout());
    getContentPane().add(scroller, BorderLayout.CENTER);
    getContentPane().add(new JLabel("Famous twins"), BorderLayout.NORTH);
}

public Vector createData()
{
    Vector result = new Vector();
    Vector rec = new Vector();
    Object[] value = new Object[] {"Benji Madden", "Joel Madden"};
    rec.add(value);
    value = new Object[] {"Mary-Kate Olsen", "Ashley Olsen"};
    rec.add(value);
    result.add(rec);
    rec = new Vector();
    value = new Object[] {"Charlie Read", "Craig Read"};
    rec.add(value);
    value = new Object[] {"Tegan Quin", "Sara Quin"};
    rec.add(value);
    result.add(rec);
    return result;
}

public static void main(String[] args)
{
    final SplitCellsExample frame = new SplitCellsExample();
    frame.setSize(500, 400);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    Runnable r = new Runnable() {
      public void run() {
        frame.setVisible(true);
      }
    };
    SwingUtilities.invokeLater(r);
}

/**********************************************************/

public class SplitCellTableModel extends DefaultTableModel
 {
public SplitCellTableModel()
{
}

public int getRowCount()
{
    return data.size();
}

public int getColumnCount()
{
    return 2;
}

public String getColumnName(int col)
{
    if (col == 0)
        return "Lads";
    else
        return "Lasses";
}

public Object getValueAt(int row, int col)
{
    Vector rec = (Vector)data.get(row);
    return rec.get(col);
}

public Vector getDataVector()
{
    return data;
}

public boolean isCellEditable(int row, int col)
{
    return true;
}

public void setValueAt(Object value, int row, int col)
{
    Vector rec = (Vector)data.get(row);
    rec.setElementAt(value, col);
}
 }

/**********************************************************************/
public class SplitTableCellEditor extends AbstractCellEditor implements TableCellEditor
{
JPanel editingPanel;
JTextField leftTextField;
JTextField rightTextField;

public SplitTableCellEditor()
{
    super();
    editingPanel = new JPanel();
    editingPanel.setLayout(new GridLayout(1, 2));
    leftTextField = new JTextField();
    editingPanel.add(leftTextField);
    rightTextField = new JTextField();
    editingPanel.add(rightTextField);
}

public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int rowIndex, int colIndex)
{
    Object[] splitVal = (Object[])value; // cast to array of Object
    if (splitVal != null)
    {
        String leftStr = (String)splitVal[0];
        String rightStr = (String)splitVal[1];
        leftTextField.setText(leftStr == null ? "" : leftStr);
        rightTextField.setText(rightStr == null ? "" : rightStr);
    }
    else
    {
        leftTextField.setText("");
        rightTextField.setText("");
    }
    return editingPanel;
}

public Object getCellEditorValue()
{
    Object[] value = new Object[] {leftTextField.getText(), rightTextField.getText()};
    return value;
}
}
/****************************************************************/
public class SplitTableCellRenderer implements TableCellRenderer
{
JPanel rendererPanel;
JLabel leftLabel;
JLabel rightLabel;

public SplitTableCellRenderer()
{
    super();

    rendererPanel = new JPanel();
    rendererPanel.setLayout(new GridLayout(1, 2));
    leftLabel = new JLabel();
    leftLabel.setOpaque(true);
    leftLabel.setBackground(Color.white);
    rendererPanel.add(leftLabel);
    rightLabel = new JLabel();
    rightLabel.setOpaque(true);
    rightLabel.setBackground(Color.white);
    rendererPanel.add(rightLabel);
}

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col)
{
    Object[] splitVal = (Object[])value; // cast to array of Object
    if (splitVal != null)
    {
        String leftStr = (String)splitVal[0];
        String rightStr = (String)splitVal[1];
        leftLabel.setText(leftStr == null ? "" : leftStr);
        rightLabel.setText(rightStr == null ? "" : rightStr);
    }
    else
    {
        leftLabel.setText("");
        rightLabel.setText("");
    }
    return rendererPanel;
}
 }

  }
person blackbishop    schedule 04.08.2014