繁体   English   中英

Java Swing —在JTable中嵌入Jbutton的Jpanel

[英]Java Swing — Jpanel with Jbuttons embedded within a JTable

我在Swing中构建一个Ui,其中我的要求是在JTable中包含JPanes。 这些JPanes中将包含JButton。
我的用例如下-
我正在编写一个MethodEditor,其中我提供了一个UI来在提供的文件中存储方法。 用户界面还允许在单击按钮时编辑传递给方法的参数。
每个单一方法都具有如下UI表示形式- 在此处输入图片说明

我对Method类的基本表示如下-

public Class Method {

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

现在我有了一个Method对象List<Method> methodListList<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不显示。 任何有关我可能在做错事情的指示都将大有帮助。

不要在JTable中包含其他组件。 更不用说组件和其他多个组件了。 原因是JTable 不会将鼠标事件传递到其单元格。 因此,即使您在JTable中具有按钮,也必须注意通过以下方式自行按下按钮:

  • 获取单击它的单元格
  • 得到确切的坐标
  • 将这些坐标外推到内部组件
  • 手动调用单击相应的按钮。

即使那样,您也不会得到按钮动画和东西。

如果需要将组件安排到表中,请将JPanel与GridLayout或GridBagLayout一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM