Java 可编辑JTableHeader
可能重复:Java 可编辑JTableHeader,java,swing,jtable,jtableheader,Java,Swing,Jtable,Jtableheader,可能重复: 如何将JTableHeader设置为可编辑。F.e.我将ColumnHeader设置为JTextField。我必须做什么才能使JTextField可编辑。请参见示例: import java.awt.*; import javax.swing.*; import javax.swing.table.*; import java.awt.event.*; public class Test extends JFrame { String[][] cellValues = {
如何将JTableHeader设置为可编辑。F.e.我将ColumnHeader设置为JTextField。我必须做什么才能使JTextField可编辑。请参见示例:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.*;
public class Test extends JFrame {
String[][] cellValues = { { "v00", "v01", "v02" }, { "v10", "v11", "v12" },
{ "v20", "v21", "v22" }, { "v30", "v31", "v32" },
{ "v40", "v41", "v42" }, { "v50", "v51", "v52" } };
String[] columnNames = { "v00", "v01", "v02" };
javax.swing.JTable jTable1 = new javax.swing.JTable(cellValues, columnNames);
public Test() {
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
this.getContentPane().add(new JScrollPane(jTable1), null);
for (int i = 0; i < 3; i++)
jTable1.getColumnModel().getColumn(i)
.setHeaderRenderer(new Renderer());
}
public static void main(String[] args) {
Test frame = new Test();
frame.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.pack();
frame.setVisible(true);
}
}
class Renderer extends JPanel implements TableCellRenderer {
JLabel label = new JLabel(" ");
JTextField field = new JTextField("%");
public Renderer() {
super(new BorderLayout());
add(label, BorderLayout.NORTH);
add(field, BorderLayout.CENTER);
setBorder(BorderFactory.createEtchedBorder());
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
label.setText(value.toString());
return (JComponent) this;
}
public String toString() {
return label.toString();
}
public void setText(String text) {
label.setText(text);
}
}
import java.awt.*;
导入javax.swing.*;
导入javax.swing.table.*;
导入java.awt.event.*;
公共类测试扩展了JFrame{
字符串[][]单元格值={{“v00”、“v01”、“v02”}、{“v10”、“v11”、“v12”},
{“v20”、“v21”、“v22”}、{“v30”、“v31”、“v32”},
{“v40”、“v41”、“v42”}、{“v50”、“v51”、“v52”};
字符串[]columnNames={“v00”、“v01”、“v02”};
javax.swing.JTable jTable1=新的javax.swing.JTable(单元格值、列名);
公开考试(){
试一试{
jbInit();
}捕获(例外e){
e、 printStackTrace();
}
}
私有void jbInit()引发异常{
this.getContentPane().add(新的JScrollPane(jTable1),null);
对于(int i=0;i<3;i++)
jTable1.getColumnModel().getColumn(i)
.setHeaderRenderer(新渲染器());
}
公共静态void main(字符串[]args){
测试框架=新测试();
frame.addWindowListener(新java.awt.event.WindowAdapter(){
公共无效窗口关闭(WindowEvent e){
系统出口(0);
}
});
frame.pack();
frame.setVisible(true);
}
}
类呈现器扩展JPanel实现TableCellRenderer{
JLabel标签=新的JLabel(“”);
JTextField=newjtextfield(“%”);
公共图书馆(){
超级(新边框布局());
添加(标签,边框布局。北);
添加(字段、边框布局、中心);
setboorder(BorderFactory.createEtchedBorder());
}
公共组件GetTableCellRenderComponent(JTable表、对象值、,
布尔值(已选择,布尔值为焦点,整数行,整数列){
label.setText(value.toString());
返回(JComponent)此;
}
公共字符串toString(){
返回标签.toString();
}
公共void setText(字符串文本){
label.setText(文本);
}
}
下面的链接下有一个完整的解决方案,乍一看很不错!
这里有一个制作可编辑标题的简单方法(无需自定义渲染器或UI):
也请参见这些有用的内容。它仅适用于JTextFields。如果我尝试对combobox执行相同的操作,则下拉列表无法正确呈现。@Benas,这是因为您试图将
JComboBox
放在JPopupMenu
上,这是一个单独的问题。我建议在论坛上搜索这个答案,或者开始一个单独的问题。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
public class JTableEditableHeaderDemo implements Runnable
{
private JTable table;
private JTableHeader header;
private JPopupMenu renamePopup;
private JTextField text;
private TableColumn column;
public static void main(String[] args)
{
SwingUtilities.invokeLater(new JTableEditableHeaderDemo());
}
public JTableEditableHeaderDemo()
{
table = new JTable(10, 5);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
header = table.getTableHeader();
header.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent event)
{
if (event.getClickCount() == 2)
{
editColumnAt(event.getPoint());
}
}
});
text = new JTextField();
text.setBorder(null);
text.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
renameColumn();
}
});
renamePopup = new JPopupMenu();
renamePopup.setBorder(new MatteBorder(0, 1, 1, 1, Color.DARK_GRAY));
renamePopup.add(text);
}
public void run()
{
JFrame f = new JFrame("Double-click header to edit");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(table));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private void editColumnAt(Point p)
{
int columnIndex = header.columnAtPoint(p);
if (columnIndex != -1)
{
column = header.getColumnModel().getColumn(columnIndex);
Rectangle columnRectangle = header.getHeaderRect(columnIndex);
text.setText(column.getHeaderValue().toString());
renamePopup.setPreferredSize(
new Dimension(columnRectangle.width, columnRectangle.height - 1));
renamePopup.show(header, columnRectangle.x, 0);
text.requestFocusInWindow();
text.selectAll();
}
}
private void renameColumn()
{
column.setHeaderValue(text.getText());
renamePopup.setVisible(false);
header.repaint();
}
}