显示代码而不是显示组件

问题描述:

请看下面的代码

import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class TestSend extends JFrame 
    {
        private Box names, emails;
        private JButton ok;
        private Map mMap;
        private JLabel nameLabel, emailLabel;
        private JPanel mainPanel;
        private JScrollPane scroll;
        private JTable table;
        private Object[][] data;
        private int counter = 0;
        private List nameHolder;

        private String[] colNames = {"Names","Emails"};

        public TestSend()
        {
            nameHolder = new ArrayList();

            names = new Box(BoxLayout.Y_AXIS);
            emails = new Box(BoxLayout.Y_AXIS);

            nameLabel = new JLabel("Names");
            emailLabel = new JLabel("Email");

            mainPanel = new JPanel();
            mainPanel.setLayout(new GridLayout(2,2));

            scroll = new JScrollPane(mainPanel);

            mainPanel.add(nameLabel);
            mainPanel.add(emailLabel);
            mainPanel.add(names);
            mainPanel.add(emails);

            mMap = new HashMap();

            mMap.put("yohan", "yy@yahoo.com");
            mMap.put("Gihan", "gihan@yahoo.com");
            mMap.put("Sumi", "sumi@yahoo.com");
            mMap.put("mac", "mac@yahoo.com");
            mMap.put("Jay", "jay@yahoo.com");
            mMap.put("Rom", "rom@yahoo.com");
            mMap.put("shane", "shane@yahoo.com");
            mMap.put("Mafe", "mafe@yahoo.com");
            mMap.put("willi", "");


            data = new Object[mMap.size()][mMap.size()];

            Iterator iter = mMap.entrySet().iterator();



            while(iter.hasNext())
            {
                Map.Entry mEntry = (Map.Entry)iter.next();

                JCheckBox cBox = new JCheckBox((String)mEntry.getKey());
                JLabel lLabel = new JLabel();

                names.add(cBox);
                String cName = cBox.getText();

                nameHolder.add(cName);

                if((String)mEntry.getValue() != null && ((String)mEntry.getValue()).length() != 0  && !((String)mEntry.getValue()).equals(""))
                {
                    lLabel = new JLabel((String)mEntry.getValue());
                   // lLabel.setPreferredSize(new Dimension(cBox.getPreferredSize().width,cBox.getPreferredSize().height));
                    emails.add(lLabel);
                    emails.add(new JPanel());

                }
                else
                {
                    lLabel = new JLabel();
                    //lLabel.setPreferredSize(new Dimension(cBox.getPreferredSize().width,cBox.getPreferredSize().height));
                    emails.add(lLabel);
                    emails.add(new JPanel());
                }

                data[counter][0] = cBox;
                data[counter][1] = lLabel;

                counter++;

            }

            table = new JTable(data,colNames);

            this.add(new JScrollPane(table));
            this.pack();
            this.setVisible(true);

        }

        public static void main(String[]args)
        {
            new TestSend();
        }
    }

在这里,当我运行此代码时,显示的是代码,而不是JCheckBox或JLabel.情况显示在附件中.请帮助

Here when I run this, what is getting displayed is code, not JCheckBox or JLabel. Situation is displayed in the attachment. Please help

您使用JTable 根本错误.请勿将Component添加到JTable显示的Model中.您的Model组成. JTable使用Renderer显示这些值.由于您的值是Component,即未注册任何特定渲染器的类型,因此将使用默认渲染器:toString.这不是代码,而是组件的String表示形式.

You are using JTable fundamentally wrong. You don't add Components to the Model that are displayed by the JTable. Your Model consists of the values. The JTable uses Renderer to display these values. As your values are Components, a type for what no specific renderer is registered, the default renderer is used: toString. Which is not the code, but a String representation of the component.

请查看 JTable教程.您需要从头开始.

Please have a look at the JTable tutorial. You need to start over from the beginning.