当前位置: 首页 > 知识库问答 >
问题:

如何将不同的JComboBox直接放在JTable的每一行中

于嘉许
2023-03-14

我想在我的应用程序中创建一个JTable。该表将包含两个库,第一个是软件模块的名称。第二列需要包含一个JComboBox,第一列中包含软件模块的修订号。

这甚至可能,或者我需要找到另一种方法来做到这一点?(例如:将按钮放在单元格中,然后从弹出窗口中选择修订版本)

提前谢谢你!

共有2个答案

颛孙和颂
2023-03-14

重写 getCellEditor(...) 方法以返回组合框:

import java.awt.*;
import java.util.List;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import javax.swing.table.*;

public class TableComboBoxByRow extends JPanel
{
    List<String[]> editorData = new ArrayList<String[]>(3);

    public TableComboBoxByRow()
    {
        setLayout( new BorderLayout() );

        // Create the editorData to be used for each row

        editorData.add( new String[]{ "Red", "Blue", "Green" } );
        editorData.add( new String[]{ "Circle", "Square", "Triangle" } );
        editorData.add( new String[]{ "Apple", "Orange", "Banana" } );

        //  Create the table with default data

        Object[][] data =
        {
            {"Color", "Red"},
            {"Shape", "Square"},
            {"Fruit", "Banana"},
            {"Plain", "Text"}
        };
        String[] columnNames = {"Type","Value"};

        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        JTable table = new JTable(model)
        {
            //  Determine editor to be used by row
            public TableCellEditor getCellEditor(int row, int column)
            {
                int modelColumn = convertColumnIndexToModel( column );

                if (modelColumn == 1 && row < 3)
                {
                    JComboBox<String> comboBox1 = new JComboBox<String>( editorData.get(row));
                    return new DefaultCellEditor( comboBox1 );
                }
                else
                    return super.getCellEditor(row, column);
            }
        };

        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );
//      table.getColumnModel().getColumn(1).setCellRenderer(new ComboBoxRenderer2() );
    }
/*
    class ComboBoxRenderer2 extends DefaultTableCellRenderer
    {
        @Override
        public Component getTableCellRendererComponent(
            JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
        {
            JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            label.setIcon(UIManager.getIcon("Table.descendingSortIcon"));
            return label;
        }
    }
*/
    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("Table Combo Box by Row");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new TableComboBoxByRow() );
        frame.setSize(200, 200);
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
梁建德
2023-03-14

这是使用DefaultComboBoxModel的一种可能实现

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class EditableComboCellEditorTest {
  private JComponent makeUI() {
    String[] columnNames = {"version", "revision"};
    Object[][] data = {
      {"1.7.0", makeModel(76, 79, 80)},
      {"1.8.0", makeModel(91, 92, 101, 102)},
    };
    TableModel model = new DefaultTableModel(data, columnNames) {
      @Override public Class<?> getColumnClass(int column) {
        return column == 1 ? DefaultComboBoxModel.class : String.class;
      }
    };
    JTable table = new JTable(model);
    table.setRowHeight(32);
    table.setAutoCreateRowSorter(true);

    TableColumn col = table.getColumnModel().getColumn(1);
    col.setCellRenderer(new ComboCellRenderer());
    col.setCellEditor(new ComboCellEditor());

    return new JScrollPane(table);
  }
  private static DefaultComboBoxModel<Integer> makeModel(Integer... items) {
    return new DefaultComboBoxModel<Integer>(items) {
      @Override public String toString() {
        return Objects.toString(getSelectedItem(), "");
      }
    };
  }
  public static void main(String... args) {
    EventQueue.invokeLater(() -> {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new EditableComboCellEditorTest().makeUI());
      f.setSize(320, 240);
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}

class ComboCellRenderer implements TableCellRenderer {
  private final JPanel p = new JPanel(new GridBagLayout());
  private final JComboBox<Integer> cb = new JComboBox<>();
  @Override public Component getTableCellRendererComponent(
    JTable table, Object value, boolean isSelected, boolean hasFocus,
    int row, int column) {
    p.removeAll();
    p.setOpaque(false);
    p.add(cb);
    cb.setEditable(true);
    cb.removeAllItems();
    if (value instanceof DefaultComboBoxModel) {
      DefaultComboBoxModel m = (DefaultComboBoxModel) value;
      Object o = m.getSelectedItem();
      if (o instanceof Integer) {
        cb.addItem((Integer) o);
      }
    }
    return p;
  }
}
//https://java-swing-tips.blogspot.jp/2016/08/use-editable-jcombobox-as.html
class ComboCellEditor extends AbstractCellEditor implements TableCellEditor {
  private final JPanel p = new JPanel(new GridBagLayout());
  private final JComboBox<Integer> cb = new JComboBox<>();
  protected ComboCellEditor() {
    super();
    cb.setEditable(true);
    cb.addActionListener(e -> fireEditingStopped());
    p.add(cb);
    p.setOpaque(false);
  }
  @Override public Component getTableCellEditorComponent(
    JTable table, Object value, boolean isSelected, int row, int column) {
    if (value instanceof ComboBoxModel) {
      @SuppressWarnings("unchecked")
      ComboBoxModel<Integer> m = (ComboBoxModel<Integer>) value;
      cb.setModel(m);
    }
    return p;
  }
  @Override public Object getCellEditorValue() {
    @SuppressWarnings("unchecked")
    DefaultComboBoxModel<Integer> m = (DefaultComboBoxModel<Integer>) cb.getModel();
    if (cb.isEditable()) {
      Object o = cb.getEditor().getItem();
      if (o instanceof Integer && m.getIndexOf((Integer) o) < 0) {
        Integer value = (Integer) o;
        int n = m.getSize();
        Vector<Integer> list = new Vector<>(n + 1);
        for (int i = 0; i < n; i++) {
          list.add(m.getElementAt(i));
        }
        list.add(value);
        Collections.sort(list);
        m = new DefaultComboBoxModel<Integer>(list);
        cb.setModel(m);
        cb.setSelectedIndex(m.getIndexOf(value));
      }
    }
    return m;
  }
}

 类似资料:
  • 我有一个在运行时加载行的表。加载后,用户需要在每一行的第一列中从中选择一个项目。然后他需要在每行的同一行上从另一个中选择一个项目。第二个的内容取决于第一个的选择。 我现在的编码方式是更改整个第二列的combobox内容。 有没有一种方法可以让每一行的组合框对象都不一样,这样我就可以在第一个组合框中选择一个值的时候处理它?

  • 我创建了包含员工信息的。在这个JTable中,我添加了名为“资历”的列。此列由表示(每行的内容不同)。例如: 内容取自。 问题是在第1行和第2行中选择的项目是“程序员”,但是“程序员”不应该出现在第2行中。只有当我单击时,才会出现正确的列表,即第2行-{“writer”,“editor”}。

  • 问题内容: 我想将单个JComboBoxes放入JTable的每个单元格中。即。每个单元格的JComboBox内容都不相同。 我基本上希望能够仅调用以下代码以将JComboBox行添加到JTable中。有人知道吗?谢谢 我可以找到的最接近的示例代码如下。但这是针对单个列的JComboBox内容相同的地方。不是我需要的解决方案。 哪里 问题答案: 最简单的方法是实现自己的TableModel 将此加

  • 问题内容: 我想在第1列的JTable(3,3)内添加JComboBox。但是在第1列中,每一行都有其自己的ComboBox元素集。当我尝试使用 每行都设置为同一组ComboBox值。但是我希望每一行ComboBox都有不同的项目。 问题答案: java2s.com上的示例看起来可以正常工作,然后再进行示例(例如,我将JComboBoxes编码为快速示例,并为今天的Swing添加/更改) 只需添加

  • 我想用JComboBox创建一个JTable。在JTable3列中,具有不同数据的JComboBox。我尝试通过DefaultCellEditor,但是所有的JCombobox都有相同的数据。

  • 001/电视购买/约翰·史密斯/真 002/冰箱购买/让·史密斯/假