获取JComboBox以在JTable中显示,而无需首先单击它

原学程将引见夺取JComboBox以在JTable中显示,而无需起首单打它的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

获取JComboBox以在JTable中显示,而无需首先单击它 教程 第1张

成绩描写

我正在测验考试懂得怎样将JComboBox搁进JTable中,是以我应用的是JTable学程中的演示。

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;

/** 
 * TableRenderDemo is just like TableDemo, except that it
 * explicitly initializes column sizes and it uses a combo box
 * as an editor for the Sport column.
 */
public class TableRenderDemo extends JPanel {
private boolean DEBUG = false;

public TableRenderDemo() {
 super(new GridLayout(一,0));

 JTable table = new JTable(new MyTableModel());
 table.setPreferredScrollableViewportSize(new Dimension(五00, 七0));
 table.setFillsViewportHeight(true);

 //Create the scroll pane and add the table to it.
 JScrollPane scrollPane = new JScrollPane(table);

 //Set up column sizes.
 initColumnSizes(table);

 //Fiddle with the Sport column's cell editors/renderers.
 setUpSportColumn(table, table.getColumnModel().getColumn(二));

 //Add the scroll pane to this panel.
 add(scrollPane);
}

/*
 * This method picks good column sizes.
 * If all column heads are wider than the column's cells'
 * contents, then you can just use column.sizeWidthToFit().
 */
private void initColumnSizes(JTable table) {
 MyTableModel model = (MyTableModel)table.getModel();
 TableColumn column = null;
 Component comp = null;
 int headerWidth = 0;
 int cellWidth = 0;
 Object[] longValues = model.longValues;
 TableCellRenderer headerRenderer =
  table.getTableHeader().getDefaultRenderer();

 for (int i = 0; i < 五; i++) {
  column = table.getColumnModel().getColumn(i);

  comp = headerRenderer.getTableCellRendererComponent(
  null, column.getHeaderValue(),
  false, false, 0, 0);
  headerWidth = comp.getPreferredSize().width;

  comp = table.getDefaultRenderer(model.getColumnClass(i)).
 getTableCellRendererComponent(
  table, longValues[i],
  false, false, 0, i);
  cellWidth = comp.getPreferredSize().width;

  if (DEBUG) {
System.out.println("Initializing width of column "
 + i + ". "
 + "headerWidth = " + headerWidth
 + "; cellWidth = " + cellWidth);
  }

  column.setPreferredWidth(Math.max(headerWidth, cellWidth));
 }
}

public void setUpSportColumn(JTable table,
  TableColumn sportColumn) {
 //Set up the editor for the sport cells.
 JComboBox comboBox = new JComboBox();
 comboBox.addItem("Snowboarding");
 comboBox.addItem("Rowing");
 comboBox.addItem("Knitting");
 comboBox.addItem("Speed reading");
 comboBox.addItem("Pool");
 comboBox.addItem("None of the above");
 sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

 //Set up tool tips for the sport cells.
 DefaultTableCellRenderer renderer =
new DefaultTableCellRenderer();
 renderer.setToolTipText("Click for combo box");
 sportColumn.setCellRenderer(renderer);
}

class MyTableModel extends AbstractTableModel {
 private String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian"};
 private Object[][] data = {
 {"Kathy", "Smith",
  "Snowboarding", new Integer(五), new Boolean(false)},
 {"John", "Doe",
  "Rowing", new Integer(三), new Boolean(true)},
 {"Sue", "Black",
  "Knitting", new Integer(二), new Boolean(false)},
 {"Jane", "White",
  "Speed reading", new Integer(二0), new Boolean(true)},
 {"Joe", "Brown",
  "Pool", new Integer(一0), new Boolean(false)}
 };

 public final Object[] longValues = {"Jane", "Kathy",
 "None of the above",
 new Integer(二0), Boolean.TRUE};

 public int getColumnCount() {
  return columnNames.length;
 }

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

 public String getColumnName(int col) {
  return columnNames[col];
 }

 public Object getValueAt(int row, int col) {
  return data[row][col];
 }

 /*
  * JTable uses this method to determine the default renderer/
  * editor for each cell.  If we didn't implement this method,
  * then the last column would contain text ("true"/"false"),
  * rather than a check box.
  */
 public Class getColumnClass(int c) {
  return getValueAt(0, c).getClass();
 }

 /*
  * Don't need to implement this method unless your table's
  * editable.
  */
 public boolean isCellEditable(int row, int col) {
  //Note that the data/cell address is constant,
  //no matter where the cell appears onscreen.
  if (col < 二) {
return false;
  } else {
return true;
  }
 }

 /*
  * Don't need to implement this method unless your table's
  * data can change.
  */
 public void setValueAt(Object value, int row, int col) {
  if (DEBUG) {
System.out.println("Setting value at " + row + "," + col
 + " to " + value
 + " (an instance of "
 + value.getClass() + ")");
  }

  data[row][col] = value;
  fireTableCellUpdated(row, col);

  if (DEBUG) {
System.out.println("New value of data:");
printDebugData();
  }
 }

 private void printDebugData() {
  int numRows = getRowCount();
  int numCols = getColumnCount();

  for (int i=0; i < numRows; i++) {
System.out.print(" row " + i + ":");
for (int j=0; j < numCols; j++) {
 System.out.print("  " + data[i][j]);
}
System.out.println();
  }
  System.out.println("--------------------------");
 }
}

/**
 * Create the GUI and show it.  For thread safety,
 * this method should be invoked from the
 * event-dispatching thread.
 */
private static void createAndShowGUI() {
 //Create and set up the window.
 JFrame frame = new JFrame("TableRenderDemo");
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 //Create and set up the content pane.
 TableRenderDemo newContentPane = new TableRenderDemo();
 newContentPane.setOpaque(true); //content panes must be opaque
 frame.setContentPane(newContentPane);

 //Display the window.
 frame.pack();
 frame.setVisible(true);
}

public static void main(String[] args) {
 //Schedule a job for the event-dispatching thread:
 //creating and showing this application's GUI.
 javax.swing.SwingUtilities.invokeLater(new Runnable() {
  public void run() {
createAndShowGUI();
  }
 });
}
}

平日情形下,JComboBox在单打之前没有会显示。我想让它一向显示,如许用户便晓得在该列中有1个组开框。我曾经测验考试过定制衬着器(在这个论坛上找到的1些)去处理这个成绩,但是碰到了1些成绩,让我走上了1条异常毛病的途径。有甚么1个例子解释了怎样在没有被起首面打的情形下显示组开框。TIA。

推举谜底

出现器以下所示:

class ComboBoxRenderer extends JComboBox implements TableCellRenderer
{
 public ComboBoxRenderer()
 {
  setBorder(null);
 }

 public Component getTableCellRendererComponent(
  JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
 {
  removeAllItems();
  addItem( value );

  return this;
 }
}

佳了闭于夺取JComboBox以在JTable中显示,而无需起首单打它的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。