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