2012-03-15 87 views
2

我建立了一个排序的方法编辑器。

的方法(MethodModel类),通常,具有以下元素 -
建立一个swing UI来实现一个方法编辑器

  1. List<String> inputVariableNames
  2. String resultVariableName

现在我有一个类MethodModel,其具有上述领域作为其成员。我还有一个类MethodModelContainer,它包含一个列表(LinkedList,因为被调用的方法的顺序很重要)为MethodModel s,这是当前文件/类中所有MethodModel的集合。

进出口试图使用UI搭建所凭借的一个用户可以编辑方法(或编辑MethodModel对象)的摆动UI。我计划通过每个MacroModel类有三个按钮,每个用于向上或向下箭头以将方法调用向下或向上移动LinkedList以及第三个按钮(每个按钮用于打开用户对话框可以编辑这个特定的对象的成员。
我以为有一个JTable,在MethodModelContainer的基础上,每行有1个单元格,包含3个按钮用于上述用途,每行代表一个MethodModel对象。
现在Jtable需要在MethodModelContainer更新后立即更新。
我已经阅读了关于如何将JButtons/Jpanels添加到JTable的一些示例,并且它们都涉及编写自定义Cell Renderer/Cell编辑器,这是我没有找到体面阅读理解的东西。

任何关于如何使用Jtable或其他方式实现我的用例的指针都会有所帮助。

回答

4
  • List<String> inputVariableNames

  • with rows where each row would have 1 cell containing 3 buttons

然后myabe这种方式,你可以......,我不是说,这只是,你可以这样把每JComponents到JTable中分隔的单元格

enter image description here

enter image description here

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

public class ComponentTableTest { 

    private JFrame frame; 
    private JTable CompTable = null; 
    private CompTableModel CompModel = null; 
    private JButton addButton = null; 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new ComponentTableTest().makeUI(); 
      } 
     }); 
    } 

    public void makeUI() { 
     CompTable = CreateCompTable(); 
     JScrollPane CompTableScrollpane = new JScrollPane(CompTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
       JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     JPanel bottomPanel = CreateBottomPanel(); 
     frame = new JFrame("Comp Table Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(CompTableScrollpane, BorderLayout.CENTER); 
     frame.add(bottomPanel, BorderLayout.SOUTH); 
     frame.setSize(new Dimension(800, 200)); 
     frame.setLocation(150, 150); 
     //frame.pack(); 
     frame.setVisible(true); 
    } 

    public JTable CreateCompTable() { 
     CompModel = new CompTableModel(); 
     CompModel.addRow(); 
     JTable table = new JTable(CompModel); 
     table.setRowHeight(new CompCellPanel().getPreferredSize().height); 
     table.setTableHeader(null); 
     CompCellEditorRenderer compCellEditorRenderer = new CompCellEditorRenderer(); 
     table.setDefaultRenderer(Object.class, compCellEditorRenderer); 
     table.setDefaultEditor(Object.class, compCellEditorRenderer); 
     return table; 
    } 

    public JPanel CreateBottomPanel() { 
     addButton = new JButton("Add Comp"); 
     addButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       Object source = ae.getSource(); 

       if (source == addButton) { 
        CompModel.addRow(); 
       } 
      } 
     }); 
     JPanel panel = new JPanel(new GridBagLayout()); 
     panel.add(addButton); 
     return panel; 
    } 
} 

class CompCellEditorRenderer extends AbstractCellEditor implements TableCellRenderer, TableCellEditor { 

    private static final long serialVersionUID = 1L; 
    private CompCellPanel renderer = new CompCellPanel(); 
    private CompCellPanel editor = new CompCellPanel(); 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     renderer.setComp((Comp) value); 
     return renderer; 
    } 

    @Override 
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
     editor.setComp((Comp) value); 
     return editor; 
    } 

    @Override 
    public Object getCellEditorValue() { 
     return editor.getComp(); 
    } 

    @Override 
    public boolean isCellEditable(EventObject anEvent) { 
     return true; 
    } 

    @Override 
    public boolean shouldSelectCell(EventObject anEvent) { 
     return false; 
    } 
} 

class CompTableModel extends DefaultTableModel { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public int getColumnCount() { 
     return 1; 
    } 

    public void addRow() { 
     super.addRow(new Object[]{new Comp(0, 0, "", "")}); 
    } 
} 

class Comp { 

    int type; 
    int relation; 
    String lower; 
    String upper; 

    public Comp(int type, int relation, String lower, String upper) { 
     this.type = type; 
     this.relation = relation; 
     this.lower = lower; 
     this.upper = upper; 
    } 
} 

class CompCellPanel extends JPanel { 

    private static final long serialVersionUID = 1L; 
    private JLabel labelWith = new JLabel("With "); 
    private JComboBox typeCombo = new JComboBox(new Object[]{"height", "length", "volume"}); 
    private JComboBox relationCombo = new JComboBox(new Object[]{"above", "below", "between"}); 
    private JTextField lowerField = new JTextField(); 
    private JLabel labelAnd = new JLabel(" and "); 
    private JTextField upperField = new JTextField(); 
    private JButton removeButton = new JButton("remove"); 

    CompCellPanel() { 
     setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); 
     relationCombo.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       enableUpper(relationCombo.getSelectedIndex() == 2); 
      } 
     }); 
     enableUpper(false); 
     removeButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JTable table = (JTable) SwingUtilities.getAncestorOfClass(JTable.class, (Component) e.getSource()); 
       int row = table.getEditingRow(); 
       table.getCellEditor().stopCellEditing(); 
       ((DefaultTableModel) table.getModel()).removeRow(row); 
      } 
     }); 
     add(labelWith); 
     add(typeCombo); 
     add(relationCombo); 
     add(lowerField); 
     add(labelAnd); 
     add(upperField); 
     add(Box.createHorizontalStrut(100)); 
     add(removeButton); 
    } 

    private void enableUpper(boolean enable) { 
     labelAnd.setEnabled(enable); 
     upperField.setEnabled(enable); 
    } 

    public void setComp(Comp Comp) { 
     typeCombo.setSelectedIndex(Comp.type); 
     relationCombo.setSelectedIndex(Comp.relation); 
     lowerField.setText(Comp.lower); 
     upperField.setText(Comp.upper); 
     enableUpper(Comp.relation == 2); 
    } 

    public Comp getComp() { 
     return new Comp(typeCombo.getSelectedIndex(), relationCombo.getSelectedIndex(), lowerField.getText(), upperField.getText()); 
    } 
} 
+0

有意义。 我已经根据您的答案来实施我的实施。然而,我遇到了一些问题。如果可能,请通过http://stackoverflow.com/questions/9737435/java-swing-jpanel-with-jbuttons-embedded-within-a-jtable。 – ping 2012-03-16 13:05:12

相关问题