Java 1个JTable列,用于2个数据选项

Java 1个JTable列,用于2个数据选项,java,swing,jtable,defaulttablemodel,jtableheader,Java,Swing,Jtable,Defaulttablemodel,Jtableheader,我有一个像这样设置的DefaultTableModel String[] columns = { "Username", "Group", "Kick", "Ban" }; Object[][] data = { { "Name1", "Owner", "Kick", "Ban" }, { "Name2", "Admin", "Kick", "Ban" } }; DefaultTableModel dm = new DefaultTableModel(data, columns); 我只想有

我有一个像这样设置的DefaultTableModel

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

DefaultTableModel dm = new DefaultTableModel(data, columns);

我只想有一个大专栏,分别命名为Kick和Ban选项。如何进行此操作?

您可以通过以下方式禁用列大小调整:

table.getTableHeader().setResizingAllowed(false);
您不能为此使用DefaultTableModel。您必须创建自己的tableModel,它扩展了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;
}
 }

  }

第一个问题是可能的,但不要这样做,因为JTableHeader使用放置在JScrollPane外的JComponents由TableColumnModelListener听,然后第二个问题可能与第二个问题无关,是的,但我想我会同时问它,而不是问一个新问题。我可以在得到答案后将其删除。对于您的第一个问题,请查看以下内容:。对于第二个问题,只需执行以下操作:table.getTableHeader.setResizingAllowedfalse;