Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单个JTable单元格中的多个对象_Java_Swing_Jtable_Listener_Defaulttablemodel - Fatal编程技术网

Java 单个JTable单元格中的多个对象

Java 单个JTable单元格中的多个对象,java,swing,jtable,listener,defaulttablemodel,Java,Swing,Jtable,Listener,Defaulttablemodel,一个JTable单元格中是否可能有多个对象,第一行的每个单元格中都有两个jlabel 在本例中,我遇到的问题是无法将任何侦听器添加到任何jlabel(图标)。我的猜测是,我需要更改其他内容,而不是CellRenderer public class JTableIcons extends JPanel { private DefaultTableModel model; private JTable table; public JTableIcons() {

一个
JTable
单元格中是否可能有多个对象,第一行的每个单元格中都有两个
jlabel

在本例中,我遇到的问题是无法将任何侦听器添加到任何
jlabel
图标
)。我的猜测是,我需要更改其他内容,而不是
CellRenderer

public class JTableIcons extends JPanel {

    private DefaultTableModel model;
    private JTable table;

    public JTableIcons() {
        initModel();
        initTable();
        this.setLayout(new BorderLayout());
        this.add(table, BorderLayout.CENTER);
    }

    class MyRenderer implements TableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {

            JPanel panel = new JPanel();
            if (row == 0) {
                JLabel lblCol = new JLabel("Column:" + column);
                Icon icon = UIManager.getIcon("OptionPane.errorIcon");
                JLabel lblIcon = new JLabel();
                lblIcon.setIcon(icon);
                panel.add(lblIcon);
                panel.add(lblCol);
            } else {
                JLabel lbl = new JLabel("(" + row + "," + column + ")");
                panel.add(lbl);
            }
            panel.setOpaque(false);
            return panel;
        }
    }

    private void initTable() {
        table = new JTable(model);
        table.setDefaultRenderer(Object.class, new MyRenderer());
        table.setShowGrid(true);
        table.setGridColor(Color.gray);
        table.setRowHeight(80);
    }

    private void initModel() {
        String[] cols = { "", "", "" };
        Object[][] rows = { { "", "", "" }, { "", "", "" }, { "", "", "" }, { "", "", "" } };
        model = new DefaultTableModel(rows, cols);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new JTableIcons());
                f.setVisible(true);
                f.setSize(new Dimension(500, 350));
                f.setLocationRelativeTo(null);
            }
        });
    }
}
我想添加两个或更多对象

不要使用两个组件,一个组件就可以了。中的实现了
图标
界面,以利用文本和图标的灵活相对定位。必要时,将多个组件添加到合适的轻型
容器中,例如
JPanel

然后对添加的对象使用不同的侦听器


要实现交互性,请使用
TableCellEditor
。这将管理面板中的单选按钮。

感谢程序员提供的示例。设法想出了这个:

两个图标都有连接到它的侦听器

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;
import java.util.Vector;

import javax.imageio.ImageIO;
import javax.swing.AbstractCellEditor;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;

public class IconsInTableCell extends JPanel {

    private static final String[] COLUMN_NAMES = { "Icons" };
    private MyTableModel tableModel;
    private JTable table;
    private JFrame frame = new JFrame();

    public IconsInTableCell() {
        super(new BorderLayout(0, 5));
        setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        tableModel = new MyTableModel();
        table = new JTable(tableModel);
        table.setDefaultEditor(Icon.class, new IconEditor());
        table.setDefaultRenderer(Icon.class, new IconRenderer());
        table.setRowHeight(60);
        add(new JScrollPane(table), BorderLayout.CENTER);
        tableModel.add(new TableEntry());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JScrollPane(table), BorderLayout.CENTER);
        frame.pack();
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                frame.setVisible(true);
            }
        });
    }

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

            @Override
            public void run() {
                new IconsInTableCell();
            }
        });
    }

    private enum Icon {
        Delete, Sort;
    }

    private class IconPanel extends JPanel implements MouseListener {

        private JLabel icon1;
        private JLabel icon2;

        IconPanel() {
            super(new GridLayout(0, 1));
            setOpaque(true);

            try {
                icon1 = new JLabel(new ImageIcon(ImageIO.read(new File("Photo01.jpg"))));
                icon2 = new JLabel(new ImageIcon(ImageIO.read(new File("tst.jpg"))));

                icon1 = new JLabel(UIManager.getIcon("OptionPane.errorIcon"));
                icon2 = new JLabel(UIManager.getIcon("OptionPane.warningIcon"));
            } catch (IOException e) {
                e.printStackTrace();
            }

            icon1.addMouseListener(this);
            icon2.addMouseListener(this);

            this.setLayout(new GridBagLayout());
            GridBagConstraints c = new GridBagConstraints();
            add(icon1, c);
            add(new JLabel("TEXT"), c);
            add(icon2, c);
        }

        @Override
        public void mouseClicked(MouseEvent e) {
            if (e.getSource() == icon1)
                System.out.println("icon1");
            else if (e.getSource() == icon2)
                System.out.println("icon2");
        }

        @Override
        public void mousePressed(MouseEvent e) {
        }

        @Override
        public void mouseReleased(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }
    }

    private class TableEntry {

        private Icon theIcons;

        TableEntry() {
        }

        TableEntry(Icon aIcons) {
            theIcons = aIcons;
        }

        public Icon getIcons() {
            return theIcons;
        }

        public void setIcons(Icon aIcon) {
            theIcons = aIcon;
        }
    }

    private class MyTableModel extends AbstractTableModel {

        private Vector<Object> theEntries;

        MyTableModel() {
            theEntries = new Vector<Object>();
        }

        @SuppressWarnings("unchecked")
        public void add(TableEntry anEntry) {
            int index = theEntries.size();
            theEntries.add(anEntry);
            fireTableRowsInserted(index, index);
        }

        public void remove(int aRowIndex) {
            if (aRowIndex < 0 || aRowIndex >= theEntries.size()) {
                return;
            }
            theEntries.removeElementAt(aRowIndex);
            fireTableRowsDeleted(aRowIndex, aRowIndex);
        }

        public int getRowCount() {
            return theEntries.size();
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return Icon.class;
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            TableEntry entry = (TableEntry) theEntries.elementAt(rowIndex);
            entry.setIcons((Icon) aValue);
            fireTableCellUpdated(rowIndex, columnIndex);
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return true;
        }

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

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            TableEntry entry = (TableEntry) theEntries.elementAt(rowIndex);
            switch (columnIndex) {
            case 0:
                return entry.getIcons();
            }
            return null;
        }
    }

    private class IconEditor extends AbstractCellEditor implements TableCellEditor {

        private IconPanel theIconPanel;

        IconEditor() {
            theIconPanel = new IconPanel();
        }

        @Override
        public Object getCellEditorValue() {
            return null;
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            if (isSelected) {
                theIconPanel.setBackground(table.getSelectionBackground());
            } else {
                theIconPanel.setBackground(table.getBackground());
            }
            return theIconPanel;
        }
    }

    private class IconRenderer extends IconPanel implements TableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (isSelected) {
                setBackground(table.getSelectionBackground());
            } else {
                setBackground(table.getBackground());
            }
            return this;
        }
    }
}
导入java.awt.BorderLayout;
导入java.awt.Component;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.GridLayout;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.io.File;
导入java.io.IOException;
导入java.util.Vector;
导入javax.imageio.imageio;
导入javax.swing.AbstractCellEditor;
导入javax.swing.BorderFactory;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.SwingUtilities;
导入javax.swing.UIManager;
导入javax.swing.table.AbstractTableModel;
导入javax.swing.table.TableCellEditor;
导入javax.swing.table.TableCellRenderer;
公共类IconsInTableCell扩展了JPanel{
私有静态最终字符串[]列名称={“图标”};
私有MyTableModel tableModel;
专用JTable表;
私有JFrame=新JFrame();
公共IConSensableCell(){
超级(新边界布局(0,5));
setBorder(BorderFactory.createEmptyByOrder(5,5,5,5));
tableModel=新的MyTableModel();
table=新的JTable(tableModel);
setDefaultEditor(Icon.class,新的IconEditor());
setDefaultRenderer(Icon.class,新的IconRenderer());
表1.设置行高(60);
添加(新的JScrollPane(表),BorderLayout.CENTER);
tableModel.add(newtableentry());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
添加(新的JScrollPane(表),BorderLayout.CENTER);
frame.pack();
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
frame.setVisible(true);
}
});
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
新的IconsInTableCell();
}
});
}
私有枚举图标{
删除、排序;
}
私有类IconPanel扩展JPanel实现MouseListener{
私人JLabel-icon1;
私人JLabel icon2;
IconPanel(){
超级(新网格布局(0,1));
set不透明(true);
试一试{
icon1=新的JLabel(新的ImageIcon(ImageIO.read)(新文件(“Photo01.jpg”));
icon2=新的JLabel(新的ImageIcon(ImageIO.read)(新文件(“tst.jpg”));
icon1=新的JLabel(UIManager.getIcon(“OptionPane.errorIcon”);
icon2=新的JLabel(UIManager.getIcon(“OptionPane.warningIcon”);
}捕获(IOE异常){
e、 printStackTrace();
}
icon1.addMouseListener(本);
icon2.addMouseListener(本);
this.setLayout(新的GridBagLayout());
GridBagConstraints c=新的GridBagConstraints();
添加(icon1,c);
添加(新JLabel(“文本”),c;
添加(icon2,c);
}
@凌驾
公共无效mouseClicked(MouseEvent e){
如果(如getSource()==icon1)
系统输出打印项次(“icon1”);
else if(例如getSource()==icon2)
系统输出打印项次(“icon2”);
}
@凌驾
公共无效鼠标按下(MouseEvent e){
}
@凌驾
公共无效MouseEvent(MouseEvent e){
}
@凌驾
公共无效鼠标事件(鼠标事件e){
}
@凌驾
公共无效mouseExited(MouseEvent e){
}
}
私有类表格条目{
私人偶像有神论者;
TableEntry(){
}
表格条目(图标图标图标){
有神论=爱子;
}
公共图标getIcons(){
归还有神论者;
}
公共无效设置图标(图标aIcon){
有神论=爱康;
}
}
私有类MyTableModel扩展了AbstractTableModel{
私有向量入口;
MyTableModel(){
entries=新向量();
}
@抑制警告(“未选中”)
公共作废添加(表格条目输入){
int index=entries.size();
输入。添加(输入);
fireTableRowsInserted(索引,索引);
}
公共无效删除(int AROVINDEX){
如果(aRowIndex<0 | | aRowIndex>=entries.size()){
返回;
}
入口移除元件(Arovindex);
fireTableRowsDeleted(Arovindex,Arovindex);
}
public int getRowCount(){
返回entries.size();
}
@凌驾
公共类getColumnClass(int columnIndex){
返回Icon.class;
}
@凌驾
public void setValueAt(对象有效、int行索引、int列索引){
TableEntry=(制表符)