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=(制表符)