Java 重命名表格标题
在我的JTable中,我想使用右键单击选项重命名表格标题。在右键单击任何标题时,它会提供重命名标题的选项。但当我这样做时,它会重命名所选列的标题。因此,我必须首先左键单击该列,然后才能进一步处理。 有没有办法,当我右键单击任何列时,它也会被选中,这样在重命名之后,它的值就会被重命名 我的动作监听器如下:Java 重命名表格标题,java,swing,jtable,defaulttablemodel,Java,Swing,Jtable,Defaulttablemodel,在我的JTable中,我想使用右键单击选项重命名表格标题。在右键单击任何标题时,它会提供重命名标题的选项。但当我这样做时,它会重命名所选列的标题。因此,我必须首先左键单击该列,然后才能进一步处理。 有没有办法,当我右键单击任何列时,它也会被选中,这样在重命名之后,它的值就会被重命名 我的动作监听器如下: int column = jTable1.getSelectedColumn(); if (column == -1) {
int column = jTable1.getSelectedColumn();
if (column == -1) {
return;
}
if (column == 0) {
JOptionPane.showMessageDialog(jTable1, "You can not rename this column.");
return;
}
boolean blag = true;
String sColumnName = null;
while (blag) {
sColumnName = (String) JOptionPane.showInputDialog(jTable1, "Enter Column Name", "Add Column", JOptionPane.INFORMATION_MESSAGE, null, null, null);
if (sColumnName == null) {
return;
}
if (sColumnName.trim().equalsIgnoreCase("")) {
JOptionPane.showMessageDialog(jTable1, "Column name can not be blank.");
blag = true;
} else {
blag = false;
}
Vector vColumns = new Vector();
for (int i = 0; i < defaultTableModel.getColumnCount(); i++) {
vColumns.add(defaultTableModel.getColumnName(i));
}
if (vColumns.contains(sColumnName)) {
JOptionPane.showMessageDialog(jTable1, "Column name " + sColumnName + " already exist.");
return;
}
}
int viewColumn = jTable1.convertColumnIndexToView(column);
int totalColumn = defaultTableModel.getColumnCount();
Object[] headers = new Object[totalColumn];
for (int i = 0; i < totalColumn; i++) {
if (i == column) {
headers[i] = sColumnName;
} else {
headers[i] = defaultTableModel.getColumnName(i);
}
}
defaultTableModel.setColumnIdentifiers(headers);
int column=jTable1.getSelectedColumn();
如果(列==-1){
返回;
}
如果(列==0){
showMessageDialog(jTable1,“您不能重命名此列”);
返回;
}
布尔blag=true;
字符串sColumnName=null;
while(废话){
sColumnName=(字符串)JOptionPane.showInputDialog(jTable1,“输入列名”,“添加列”,JOptionPane.INFORMATION\u消息,null,null,null);
if(sColumnName==null){
返回;
}
if(sColumnName.trim().equalsIgnoreCase(“”){
showMessageDialog(jTable1,“列名不能为空”);
布拉格=真;
}否则{
blag=假;
}
向量vColumns=新向量();
对于(int i=0;i
我想念那里
1) MouseListener
并使用值retuns确定所选的列
header.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
JTableHeader h = (JTableHeader) e.getSource();
int i = h.columnAtPoint(e.getPoint());
Object o = h.getColumnModel().getColumn(i).getHeaderValue();
if (i < 0 || o == selectedColumn) {
selectedColumn = null;
return;
}
selectedColumn = o;
h.requestFocusInWindow();
}
});
3) 另一种方法是添加(注意,从未尝试过,也不确定编辑器是否按预期工作,仅举一个例子,我确信这需要一些修改)感谢@mKorbel的回复。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class SelectedTableHeader {
private JFrame frame = new JFrame("Table Demo");
private JTableHeader header;
private Object selectedColumn = null;
private String[] columnNames = {"String", "Integer", "Float", "Double", "Locale & Double", "Boolean"};
private Object[][] data = {
{"aaa", new Integer(12), new Float(12.15), new Double(100.05), new Double(12.05), true},
{"bbb", new Integer(5), new Float(7.154), new Double(6.1555), new Double(417.55), false},
{"CCC", new Integer(92), new Float(0.1135), new Double(3.1455), new Double(11.05), true},
{"ddd", new Integer(12), new Float(31.15), new Double(10.05), new Double(23.05), true},
{"eee", new Integer(5), new Float(5.154), new Double(16.1555), new Double(17.55), false},
{"fff", new Integer(92), new Float(4.1135), new Double(31.1455), new Double(3.05), true}};
private TableModel model = new DefaultTableModel(data, columnNames) {
private static final long serialVersionUID = 1L;
@Override
public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
private JTable table = new JTable(model);
public SelectedTableHeader() {
header = table.getTableHeader();
header.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
JTableHeader h = (JTableHeader) e.getSource();
int i = h.columnAtPoint(e.getPoint());
Object o = h.getColumnModel().getColumn(i).getHeaderValue();
if (i < 0) {
selectedColumn = null;
return;
}
selectedColumn = o;
header.getColumnModel().getColumn(i).setHeaderValue("Clicked");
h.requestFocusInWindow();
}
});
final TableCellRenderer hr = table.getTableHeader().getDefaultRenderer();
header.setDefaultRenderer(new TableCellRenderer() {
private JLabel lbl;
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (selectedColumn == value) {
lbl = (JLabel) hr.getTableCellRendererComponent(table, value, true, true, row, column);
lbl.setBorder(BorderFactory.createCompoundBorder(lbl.getBorder(), BorderFactory.createLineBorder(Color.red, 1)));
lbl.setHorizontalAlignment(SwingConstants.LEFT);
} else {
lbl = (JLabel) hr.getTableCellRendererComponent(table, value, false, false, row, column);
lbl.setBorder(BorderFactory.createCompoundBorder(lbl.getBorder(), BorderFactory.createEmptyBorder(0, 5, 0, 0)));
lbl.setHorizontalAlignment(SwingConstants.CENTER);
}
if (column == 0) {
lbl.setForeground(Color.red);
} else {
lbl.setForeground(header.getForeground());
}
/*return (value == selectedColumn) ? hr.getTableCellRendererComponent(
table, value, true, true, row, column) : hr.getTableCellRendererComponent(
table, value, false, false, row, column);*/
return lbl;
}
});
table.setRowHeight(20);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scroll = new JScrollPane(table);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(scroll);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
SelectedTableHeader selectedTableHeader = new SelectedTableHeader();
}
});
}
}