Java 需要保持某些列可编辑和不可编辑,并且只允许双击单元格即可编辑单元格
在我的Java 需要保持某些列可编辑和不可编辑,并且只允许双击单元格即可编辑单元格,java,swing,jtable,tablecelleditor,defaulttablemodel,Java,Swing,Jtable,Tablecelleditor,Defaulttablemodel,在我的JTable实现中。我必须保持某些列可编辑,而某些列不可编辑,因此我必须覆盖isCellEditable- @Override public boolean isCellEditable(int row, int col) { if (col == uneditableColumn) { return false; } return bEdit; } 现在我的要求是只允许双击单元格进行编辑,也就是说,如果用户双击单元格,则只有它进入可编辑模式。为此
JTable
实现中。我必须保持某些列可编辑,而某些列不可编辑,因此我必须覆盖isCellEditable
-
@Override
public boolean isCellEditable(int row, int col) {
if (col == uneditableColumn) {
return false;
}
return bEdit;
}
现在我的要求是只允许双击单元格进行编辑,也就是说,如果用户双击单元格,则只有它进入可编辑模式。为此,我必须制作您自己的CellEditor
并覆盖
public boolean isCellEditable( EventObject e )
有人能建议是否可以使用-
public boolean isCellEditable(int row, int col)
请帮助-好吧,我不会在
JTable
中重写isCellEditable(…)
,而是提供一个自定义表模型
从JTable#isCellEditable(…)
上的JavaDoc:
列是在表视图的显示顺序中指定的,而不是在表模型的列顺序中指定的。这是一个重要的区别,因为当用户重新排列表中的列时,视图中给定索引处的列将发生更改。同时,用户的操作不会影响模型的列顺序
此外,单元格可能看起来对表是可编辑的,但编辑器本身在双击之前可能不会提供输入字段。如果您希望一次只编辑一个单元格,那么您也可以将该信息存储在模型中,并让编辑器检查。好吧,我不会在
JTable
中覆盖isCellEditable(…)
,而是提供一个自定义表模型
is to allow edit the cell only on Double click i.e. if user double clicks
on cell then only it comes into editable mode.
从JTable#isCellEditable(…)
上的JavaDoc:
列是在表视图的显示顺序中指定的,而不是在表模型的列顺序中指定的。这是一个重要的区别,因为当用户重新排列表中的列时,视图中给定索引处的列将发生更改。同时,用户的操作不会影响模型的列顺序
此外,单元格可能看起来对表是可编辑的,但编辑器本身在双击之前可能不会提供输入字段。如果您希望一次只编辑一个单元格,那么您也可以将该信息存储在模型中,并让编辑器进行检查
is to allow edit the cell only on Double click i.e. if user double clicks
on cell then only it comes into editable mode.
你看
对于CellEditor或方法,重写isCellEditable(AbstractTableModel)
对于DefaultTableModel,它可能是
import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.*;
public class EditorRendererClickCountToStart {
public EditorRendererClickCountToStart() {
TableModel model = new DefaultTableModel(new Object[][]{
{"A", "Item 0"}, {"B", "Item 1"}, {"C", "Item 2"},
{"D", "Item 3"}, {"E", "Item 4"}}, new String[]{"TextField", "Combo"});
JTable table = new JTable(model);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
DefaultCellEditor editor = new DefaultCellEditor(new JComboBox(new Object[]{
"Item 0", "Item 1", "Item 2", "Item 3", "Item 4"}));
editor.setClickCountToStart(2);
table.getColumnModel().getColumn(1).setCellEditor(editor);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
System.out.println(info.getName());
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (UnsupportedLookAndFeelException e) {// handle exception
} catch (ClassNotFoundException e) {// handle exception
} catch (InstantiationException e) {// handle exception
} catch (IllegalAccessException e) {// handle exception
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new EditorRendererClickCountToStart();
}
});
}
}
你看
对于CellEditor或方法,重写isCellEditable(AbstractTableModel)
对于DefaultTableModel,它可能是
import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.*;
public class EditorRendererClickCountToStart {
public EditorRendererClickCountToStart() {
TableModel model = new DefaultTableModel(new Object[][]{
{"A", "Item 0"}, {"B", "Item 1"}, {"C", "Item 2"},
{"D", "Item 3"}, {"E", "Item 4"}}, new String[]{"TextField", "Combo"});
JTable table = new JTable(model);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
DefaultCellEditor editor = new DefaultCellEditor(new JComboBox(new Object[]{
"Item 0", "Item 1", "Item 2", "Item 3", "Item 4"}));
editor.setClickCountToStart(2);
table.getColumnModel().getColumn(1).setCellEditor(editor);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
System.out.println(info.getName());
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (UnsupportedLookAndFeelException e) {// handle exception
} catch (ClassNotFoundException e) {// handle exception
} catch (InstantiationException e) {// handle exception
} catch (IllegalAccessException e) {// handle exception
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new EditorRendererClickCountToStart();
}
});
}
}
@克丽奥帕特拉谢谢,这就是问题,在这个世界上什么才是真正健康的,嗯,。。。我是1号买的。地方是笑的,那么长时间什么都没有,只有一堆烂泥和上二。那个地方是Nutella???或者……,也许,很难决定:-)@mKorbel谢谢。编辑仅限于鼠标点击,抱歉——正如我所要求的,但如果用户开始使用键盘键入文本,则表的单元格允许他这样做。我们是否可以限制他也使用键盘进行编辑,除非他不双击单元格。@Ashish Pancholi,F2键是关于开始编辑的(将有关该操作的信息放入工具提示中),可能是这样:-),我认为这是不必要的,从单元格中删除MouseListener,然后最好是更改编辑器。设置ClickCountToStart(int);对于10°、20°、50°,呵呵,但我知道一些用户可能会强制执行此限制,@mKorbel我不理解您的评论,但我接受您的回答,因为您已经解决了我的问题。我实际上需要-如果用户开始按键,然后表格搜索匹配的文本为他,如果用户双击单元格,然后表格允许他编辑文本。-可能吗?请帮忙。Thanks@AshishPancholi请在任何事情发生之前,您是否有可能使用SSCCE编辑您的问题,或者开始一个新问题,因为可能存在业务或逻辑问题,因为您最后的评论不是关于用户友好的方式,可能我对您有错,带有粘贴图像的代码是最好的方式…@kleopatra谢谢,这就是这个世界上什么才是真正健康的问题,嗯,。。。我是1号买的。地方是笑的,那么长时间什么都没有,只有一堆烂泥和上二。那个地方是Nutella???或者……,也许,很难决定:-)@mKorbel谢谢。编辑仅限于鼠标点击,抱歉——正如我所要求的,但如果用户开始使用键盘键入文本,则表的单元格允许他这样做。我们是否可以限制他也使用键盘进行编辑,除非他不双击单元格。@Ashish Pancholi,F2键是关于开始编辑的(将有关该操作的信息放入工具提示中),可能是这样:-),我认为这是不必要的,从单元格中删除MouseListener,然后最好是更改编辑器。设置ClickCountToStart(int);对于10°、20°、50°,呵呵,但我知道一些用户可能会强制执行此限制,@mKorbel我不理解您的评论,但我接受您的回答,因为您已经解决了我的问题。我实际上需要-如果用户开始按键,然后表格搜索匹配的文本为他,如果用户双击单元格,然后表格允许他编辑文本。-可能吗?请帮忙。Thanks@AshishPancholi请在任何事情发生之前,您是否有可能使用SSCCE编辑您的问题,或者开始一个新问题,因为可能存在业务或逻辑问题,因为您最后的评论不是关于用户友好的方式,可能我对您有错,带有粘贴图像的代码是最好的方式。。。。