Java Swing - Jpanel с J-кнопками, встроенными в JTable - PullRequest
0 голосов
/ 16 марта 2012

Я создаю пользовательский интерфейс в Swing, в котором мое требование состоит в том, чтобы иметь JPanes в JTable. Эти JPanes будут иметь JButtons внутри них.
Мой вариант использования выглядит следующим образом -
Я пишу MethodEditor, в котором я предоставляю пользовательский интерфейс для хранения методов в предоставленном файле. Пользовательский интерфейс также позволяет редактировать параметры, передаваемые методу, одним нажатием кнопки.
Каждый метод будет иметь представление UI следующим образом: enter image description here

Мое базовое представление класса Method выглядит следующим образом -

public Class Method {

String methodName;
List<String> InputVariableNames;
String OutputVariableName;
}

Теперь у меня есть список Method объектов, List<Method> methodList, на которых я хочу основать свой JTable. Этот List содержится в классе MethodModel следующим образом -

public class MethodModel {
   List<Method> methodModel;
}

Я задал вопрос ранее и основал свой код на ответе, предоставленном там.
Однако мой код не работает. Мой код выглядит следующим образом -

public class MethodEditor extends JTable {


    private static final long serialVersionUID = 1L;

    private MethodEditorModel model ;
    private MethodCellRenderer cellRenderer;

    public MethodEditor(MethodModel bean) {
        setRowHeight(25);
        this.setPreferredSize(new Dimension(500, 500));
        model = new MethodEditorModel(bean);
        this.setModel(model);
        setupComponent();
    }

    private void setupComponent() {
        cellRenderer = new MethodCellRenderer();
        this.setDefaultRenderer(Object.class,cellRenderer);
        this.setBorder(BorderFactory.createLineBorder(Color.GRAY));
    }


    private static class MethodEditorModel extends DefaultTableModel implements PropertyChangeListener {

        /**
         * 
         */
        private static final long serialVersionUID = 1L;    
        private MethodModel bean;

        public MethodEditorModel(MethodModel bean) {
            this.bean = bean;
            bean.addPropertyChangeListener(this);
        }


        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            fireTableDataChanged();

        }

    }

    private static class MethodCellRenderer implements TableCellRenderer {

        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private MethodEditorCellPanel renderer = new MethodEditorCellPanel();


        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            MethodModel methodModel = (MethodModel)value;
            for(Method method : methodModel.getMethodList()) {
                renderer.setComponents((Method) method);
            }
            return renderer;
        }

    }

    private static class MethodEditorCellPanel extends JPanel implements ActionListener {

        private static final long serialVersionUID = 1L;
        private JButton upButton;
        private JButton downButton;
        private JButton methodDetailsButton;
        private Method method;

        public MethodEditorCellPanel() {
            upButton = new JButton("Up");
            downButton = new JButton("Down");
        }

        public void setComponents(Method method)
        {
            this.method = method;
            methodDetailsButton = new JButton(method.getMethodName());

            upButton.addActionListener(this);
            downButton.addActionListener(this);
            methodDetailsButton.addActionListener(this);

            Box verticalBar =  Box.createHorizontalBox();
            verticalBar.add(upButton);
            verticalBar.add(Box.createHorizontalStrut(15));
            verticalBar.add(methodDetailsButton);
            verticalBar.add(Box.createHorizontalStrut(15));
            verticalBar.add(downButton);
            add(verticalBar);
        }

        @Override
        public void actionPerformed(ActionEvent evt) {
            if(evt.getSource().equals(downButton)) {

            }

            if(evt.getSource().equals(upButton)) {

            }

            if(evt.getSource().equals(methodDetailsButton)) {


            }
        }

    }

}

Код компилируется, но JTable не отображается. Любые указания на то, что я могу делать неправильно, очень помогли бы.

1 Ответ

1 голос
/ 16 марта 2012

Не включайте другие компоненты в JTable. Не говоря уже о компонентах с несколькими другими компонентами. Причина в том, что JTable не будет передавать события мыши в свои ячейки. Таким образом, даже если у вас есть кнопки внутри JTable, вам придется позаботиться о том, чтобы нажимать их самостоятельно:

  • получить ячейку, на которую щелкнули
  • получить точные координаты
  • экстраполировать эти координаты на внутренний компонент
  • вызовите вручную, нажмите соответствующую кнопку.

И даже тогда вы не получите анимацию кнопок и прочее.

Если вам нужно расположить компоненты в таблице, используйте JPanel с GridLayout или GridBagLayout.

...