2013-05-05 72 views
0

我想建一個表,其中包括JComboBoxes作爲渲染器和編輯器兩個組件。這大多工作正常,但有兩件事我似乎無法解決。細胞之間可用性功能JComboBox的內JTable中

  1. Tab鍵應該做的JComboBox活躍
  2. 點擊下拉箭頭應立即打開選項列表

關於1,編輯組合應該將嵌入文本字段中的焦點,固定組合應允許向下箭頭打開選項列表。

關於2,我覺得這取決於什麼其他細胞是當前活動有時工作,但其他時間我需要雙擊。我無法使這種行爲保持一致。

爲了方便起見我已經包括其中(I相信)使用用於內JTable中嵌入JComboBoxes建議的方法的明顯例子。

謝謝你的建設性意見。

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

public class TableCombos 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame("Frame"); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     AbstractTableModel model = new DefaultTableModel() 
     { 
      String[] columnHeaders = new String[]{"label", "combo-edit", "combo-fixed"}; 
      Class<?>[] columnClasses = new Class<?>[]{String.class, Double.class, Double.class}; 
      List<Object[]> data = new ArrayList<>(); 
      { 
       data.add(new Object[]{"row 1", 1.0d, 2.0d}); 
       data.add(new Object[]{"row 2", 2.0d, 3.0d}); 
      } 

      @Override 
      public int getColumnCount() 
      { 
       return columnHeaders.length; 
      } 

      @Override 
      public boolean isCellEditable(int row, int column) 
      { 
       return column != 0; 
      } 

      @Override 
      public int getRowCount() 
      { 
       if (data == null) // race condition 
        return 0; 
       return data.size(); 
      } 

      @Override 
      public Object getValueAt(int row, int column) 
      { 
       return data.get(row)[column]; 
      } 

      @Override 
      public void setValueAt(Object aValue, int row, int column) 
      { 
       data.get(row)[column] = aValue; 
      } 

      @Override 
      public Class<?> getColumnClass(int column) 
      { 
       return columnClasses[column]; 
      } 

      @Override 
      public String getColumnName(int column) 
      { 
       return columnHeaders[column]; 
      } 
     }; 

     JTable table = new JTable(model); 
     table.setSurrendersFocusOnKeystroke(true); 

     TableColumn c1 = table.getColumnModel().getColumn(1); 
     TableColumn c2 = table.getColumnModel().getColumn(2); 

     JComboBox<Double> editorComboEditable = new JComboBox<>(new Double[]{1.0d, 2.0d, 3.0d}); 
     editorComboEditable.setEditable(true); 
     c1.setCellEditor(new DefaultCellEditor(editorComboEditable)); 
     c2.setCellEditor(new DefaultCellEditor(new JComboBox<>(new Double[]{1.0d, 2.0d, 3.0d}))); 

     final JComboBox<Double> rendererComboEditable = new JComboBox<>(new Double[]{1.0d, 2.0d, 3.0d}); 
     rendererComboEditable.setEditable(true); 
     final JComboBox<Double> rendererComboFixed = new JComboBox<>(new Double[]{1.0d, 2.0d, 3.0d}); 
     c1.setCellRenderer(new TableCellRenderer() 
     { 
      @Override 
      public Component getTableCellRendererComponent(JTable t, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
      { 
       rendererComboEditable.setSelectedItem(value); 
       return rendererComboEditable; 
      } 
     }); 
     c2.setCellRenderer(new TableCellRenderer() 
     { 
      @Override 
      public Component getTableCellRendererComponent(JTable t, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
      { 
       rendererComboFixed.setSelectedItem(value); 
       return rendererComboFixed; 
      } 
     }); 

     frame.getContentPane().add(new JScrollPane(table)); 

     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+2

*「我已經包含了一個明顯的例子」 *很好的例子。不過,要更好地解決(包括)進口問題。我通常發現所有'java.awt','java.awt.event'和'javax.swing'都可以在沒有衝突的情況下導入,所以這隻需要再多3行代碼就可以編譯一個GUI示例,並且不會出現ifs或buts'.. – 2013-05-05 03:44:49

+0

謝謝@AndrewThompson我試圖保持簡短。已包括進口和類別十二月。 – pstanton 2013-05-05 03:57:13

+0

嗯..'列表 data = new ArrayList <>();'這是一個Java 7的東西,你可以省略第二種類型?例如。 'List data = new ArrayList ();'在Java 6編譯。我在這裏得到4個編譯錯誤,用於4個簡短形式的語句。 – 2013-05-05 04:02:04

回答

3

你的問題都通過重寫DefaultCellEditor#isCellEditable方法和返回true

您可能需要設置JTable#setSurrendersFocusOnKeystroke爲true以及

更新

簡短的回答是可以解決「這很混亂」。長的答案是「這是非常混亂」

我做了一個「連續的編輯」過程中的某些時候能回來。基本上,我推翻了輸入標籤鍵綁定。

什麼我都基本上停止任何活動單元格編輯器,請注意當前單元格,然後試圖尋找下一個可編輯的單元格,如果需要,圍繞循環回到開始(電池爲0x0)。

當我發現一個可編輯的單元格,我叫JTable#esitCellAt開始編輯的單元格。

爲了讓彈出可見當細胞開始編輯,您將需要重寫JComboBoxaddNotify方法,並使用SwingUtilities#invokeLater,設置可見彈出

+0

(XxxCell)編輯器。setClickCountToStart(2); – mKorbel 2013-05-05 07:23:13

+0

@mkorbel這是一個很好的補充,但是如果你從isCelleEditable返回true,那麼它並不重要,因爲任何鍵盤或鼠標事件都將開始編輯;) – MadProgrammer 2013-05-05 07:37:23

+0

@MadProgrammer謝謝我會試試這個並儘快報告回來 – pstanton 2013-05-05 07:37:29