Java JTable,通过鼠标单击在具体单元格中动态添加标签

Java JTable,通过鼠标单击在具体单元格中动态添加标签,java,swing,jtable,Java,Swing,Jtable,我的任务是,将图像添加到具体列中,并在jTable中进行raw。我曾尝试使用setCellRendered,但它无法正常工作。也许有人也有同样的任务。 我曾尝试通过DefaultTableCellRenderer创建渲染器,但现在无法理解如何为具体单元格而不是列调用此渲染器,例如[3][4] 公共框架1(){ 初始化(); } } }不需要自定义渲染 您需要做的是: 将图标添加到表格模型 覆盖TableModel的getColumnClass(…)方法以返回Class.Icon,表将使用默认的图

我的任务是,将图像添加到具体列中,并在jTable中进行raw。我曾尝试使用setCellRendered,但它无法正常工作。也许有人也有同样的任务。 我曾尝试通过DefaultTableCellRenderer创建渲染器,但现在无法理解如何为具体单元格而不是列调用此渲染器,例如[3][4] 公共框架1(){ 初始化(); }

}


}不需要自定义渲染

您需要做的是:

  • 图标
    添加到
    表格模型
  • 覆盖
    TableModel
    getColumnClass(…)
    方法以返回
    Class.Icon
    ,表将使用默认的图标呈现器
  • 如果您确实需要自定义渲染器,请查看上的Swing教程部分,以了解更多信息和工作示例

    table.setBounds(0, 0, 350, 350);
    table.setRowHeight(50);
    frame.getContentPane().add(table);
    

    不要使用空布局!!!不要使用setBounds()。Swing设计用于布局管理器。还需要将表添加到JScrollPane中,以便显示列标题。同样,教程中的示例将向您展示如何做到这一点。因此,请阅读教程并下载演示代码

    修改了oracle.com上的示例。它显示选定单元格上的图标。请看:

    /*
     * SimpleTableDemo.java requires no other files.
     */
    import java.awt.Component;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.io.IOException;
    import java.net.URL;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.table.DefaultTableCellRenderer;
    
    public class SimpleTableDemo extends JPanel {
    
        private static final String ICON_IMAGE
                = "http://icons.iconarchive.com/icons/scafer31000/bubble-circle-3/16/GameCenter-icon.png";
    
        public SimpleTableDemo() {
            super(new GridLayout(1, 0));
    
            String[] columnNames = {"First Name",
                "Last Name",
                "Sport",
                "# of Years",
                "Vegetarian"};
    
            Object[][] data = {
                {"Kathy", "Smith",
                    "Snowboarding", new Integer(5), new Boolean(false)},
                {"John", "Doe",
                    "Rowing", new Integer(3), new Boolean(true)},
                {"Sue", "Black",
                    "Knitting", new Integer(2), new Boolean(false)},
                {"Jane", "White",
                    "Speed reading", new Integer(20), new Boolean(true)},
                {"Joe", "Brown",
                    "Pool", new Integer(10), new Boolean(false)}
            };
    
            final JTable table = new JTable(data, columnNames);
            table.setPreferredScrollableViewportSize(new Dimension(500, 70));
            table.setFillsViewportHeight(true);
            java.awt.Image image = null;
            try {
                URL imageLoc = new URL(ICON_IMAGE);
                image = ImageIO.read(imageLoc);
            } catch (IOException ex) {
                Logger.getLogger(SimpleTableDemo.class.getName()).log(Level.SEVERE, null, ex);
            }
            final ImageIcon icon = new ImageIcon(image);
            table.setDefaultRenderer(Object.class, new ImageRenderer(icon));
            //Create the scroll pane and add the table to it.
            JScrollPane scrollPane = new JScrollPane(table);
            //Add the scroll pane to this panel.
            add(scrollPane);
        }
    
        /**
         * Create the GUI and show it. For thread safety, this method should be
         * invoked from the event-dispatching thread.
         */
        private static void createAndShowGUI() {
            //Create and set up the window.
            JFrame frame = new JFrame("SimpleTableDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            //Create and set up the content pane.
            SimpleTableDemo newContentPane = new SimpleTableDemo();
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);
    
            //Display the window.
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    
        private class ImageRenderer extends DefaultTableCellRenderer {
    
            private final JLabel lbl = new JLabel();
            private final ImageIcon imageIcon;
    
            public ImageRenderer(ImageIcon imageIcon) {
                this.imageIcon = imageIcon;
                lbl.setIcon(imageIcon);
            }
    
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                    boolean hasFocus, int row, int column) {
                Component result = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                if (hasFocus && isSelected) {
                    result = lbl;
                }
                return result;
            }
        }
    }
    

    正如我所理解的,当我们点击单元格时,这个单元格应该显示图像,但在您选择另一个单元格后,它是否需要显示图像?是的,我必须播放一个简单的“连接四”。如果我在列中单击,球必须落下直到第一个自由单元。现在我试着了解如何使用表和事件。感谢您的帮助advices@Lena,很高兴这有帮助。不要忘记单击复选标记“接受”答案,这样人们就知道问题已经解决。不需要自定义渲染器。@Lena不客气!如果这是你想要的,你可以投票表决,如果是错误的,我会尝试改变it@camickr也许你是对的,你能举一些例子吗?@Lena,这不是如何使用渲染器。数据应存储在TableModel中。然后使用渲染器在JTable中显示TableModel中的数据。这段代码完全绕过了TableModel。这不是一个如何将渲染器与JTable一起使用的示例。@camickr您能解释一下TableModel与TableModel的关系吗?特别是在MVC模式的范围内?您是否建议将数据层与表示层混合使用?如果你添加了一些“正确”用法的例子,那就太完美了
    table.setBounds(0, 0, 350, 350);
    table.setRowHeight(50);
    frame.getContentPane().add(table);
    
    /*
     * SimpleTableDemo.java requires no other files.
     */
    import java.awt.Component;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.io.IOException;
    import java.net.URL;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.table.DefaultTableCellRenderer;
    
    public class SimpleTableDemo extends JPanel {
    
        private static final String ICON_IMAGE
                = "http://icons.iconarchive.com/icons/scafer31000/bubble-circle-3/16/GameCenter-icon.png";
    
        public SimpleTableDemo() {
            super(new GridLayout(1, 0));
    
            String[] columnNames = {"First Name",
                "Last Name",
                "Sport",
                "# of Years",
                "Vegetarian"};
    
            Object[][] data = {
                {"Kathy", "Smith",
                    "Snowboarding", new Integer(5), new Boolean(false)},
                {"John", "Doe",
                    "Rowing", new Integer(3), new Boolean(true)},
                {"Sue", "Black",
                    "Knitting", new Integer(2), new Boolean(false)},
                {"Jane", "White",
                    "Speed reading", new Integer(20), new Boolean(true)},
                {"Joe", "Brown",
                    "Pool", new Integer(10), new Boolean(false)}
            };
    
            final JTable table = new JTable(data, columnNames);
            table.setPreferredScrollableViewportSize(new Dimension(500, 70));
            table.setFillsViewportHeight(true);
            java.awt.Image image = null;
            try {
                URL imageLoc = new URL(ICON_IMAGE);
                image = ImageIO.read(imageLoc);
            } catch (IOException ex) {
                Logger.getLogger(SimpleTableDemo.class.getName()).log(Level.SEVERE, null, ex);
            }
            final ImageIcon icon = new ImageIcon(image);
            table.setDefaultRenderer(Object.class, new ImageRenderer(icon));
            //Create the scroll pane and add the table to it.
            JScrollPane scrollPane = new JScrollPane(table);
            //Add the scroll pane to this panel.
            add(scrollPane);
        }
    
        /**
         * Create the GUI and show it. For thread safety, this method should be
         * invoked from the event-dispatching thread.
         */
        private static void createAndShowGUI() {
            //Create and set up the window.
            JFrame frame = new JFrame("SimpleTableDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            //Create and set up the content pane.
            SimpleTableDemo newContentPane = new SimpleTableDemo();
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);
    
            //Display the window.
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    
        private class ImageRenderer extends DefaultTableCellRenderer {
    
            private final JLabel lbl = new JLabel();
            private final ImageIcon imageIcon;
    
            public ImageRenderer(ImageIcon imageIcon) {
                this.imageIcon = imageIcon;
                lbl.setIcon(imageIcon);
            }
    
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                    boolean hasFocus, int row, int column) {
                Component result = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                if (hasFocus && isSelected) {
                    result = lbl;
                }
                return result;
            }
        }
    }