Java 删除JTextField单元格编辑器的边框不会';在某些情况下我们不能工作
由于出现以下问题,本问题是本问题的后续问题: 当已在表中修改边框时,我从Java 删除JTextField单元格编辑器的边框不会';在某些情况下我们不能工作,java,swing,jtable,Java,Swing,Jtable,由于出现以下问题,本问题是本问题的后续问题: 当已在表中修改边框时,我从DefaultCellEditor#getComponent()获取的JTextArea遇到意外行为。边框在视觉上不会发生变化 即使打了电话: textField.setboorder(BorderFactory.createCompoundBorder(null,BorderFactory.createEmptyBorder(1,1,1,1)) 在那之后: System.out.println(textField.getB
DefaultCellEditor#getComponent()
获取的JTextArea
遇到意外行为。边框在视觉上不会发生变化
即使打了电话:
textField.setboorder(BorderFactory.createCompoundBorder(null,BorderFactory.createEmptyBorder(1,1,1,1))代码>
在那之后:
System.out.println(textField.getBorder())代码>
控制台显示javax.swing.border。CompoundBorder@6aff616
这意味着边框在内部发生了更改。然而,这并没有直观地反映出来,我很困惑
我的测试班:
public class TableStackOverflow extends javax.swing.JFrame {
public TableStackOverflow() {
initComponents();
prepareTable();
}
public void prepareTable() {
for (int i = 0; i < table.getColumnCount(); i++) {
Class columnClass = table.getColumnClass(i);
DefaultCellEditor defaultEditor = (DefaultCellEditor) table.getDefaultEditor(columnClass);
if (defaultEditor.getComponent() instanceof JTextField) {
JTextField textField = (JTextField) defaultEditor.getComponent();
textField.setFont(new Font("Segoe UI", Font.PLAIN, 12));
textField.setBorder(BorderFactory.createCompoundBorder(null, BorderFactory.createEmptyBorder(1, 1, 1, 1)));
System.out.println(textField.getBorder());
}
defaultEditor.setClickCountToStart(1);
}
}
private void initComponents() {
scrPane = new javax.swing.JScrollPane();
table = new org.jdesktop.swingx.JXTable();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
table.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null},
{null, null}
},
new String [] {
"First", "Second"
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.String.class
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
});
table.setSelectionBackground(new java.awt.Color(223, 238, 249));
table.setSelectionForeground(new java.awt.Color(0, 0, 0));
scrPane.setViewportView(table);
getContentPane().add(scrPane, java.awt.BorderLayout.CENTER);
pack();
}
public static void main(String args[]) {
try {
javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
}
java.awt.EventQueue.invokeLater(() -> {
new TableStackOverflow().setVisible(true);
});
}
private javax.swing.JScrollPane scrPane;
private org.jdesktop.swingx.JXTable table;
将上述语句添加到代码中,您将看到默认编辑器是GenericEditor
,它是JTable的一个内部类
此编辑器为JTable中的使用添加了额外的功能
它所做的事情之一就是管理边界。如果发现错误,编辑器中将显示“红色边框”。否则,边框将设置为默认的“黑色边框”
最后,这里有一个令人讨厌的解决办法,使它能够工作,但不可行:
public void prepareTable() {
for (int i = 0; i < table.getColumnCount(); i++) {
DefaultCellEditor defaultEditor = (DefaultCellEditor) table.getDefaultEditor(table.getColumnClass(i));
if (defaultEditor.getComponent() instanceof JTextField) {
JTextField textField = new JTextField();
textField.setFont(new Font("Segoe UI", Font.PLAIN, 12));
textField.setBorder(BorderFactory.createCompoundBorder(null, BorderFactory.createEmptyBorder(1, 1, 1, 1)));
defaultEditor = new DefaultCellEditor(textField);
table.setDefaultEditor(table.getColumnClass(i), defaultEditor);
}
defaultEditor.setClickCountToStart(1);
}
}
您需要使用DefaultCellEditor或创建自定义编辑器
您可能能够扩展JTable.GenericEditor类并重写getTableCellEditor(…)
方法。这是将边框重置为默认黑色边框的方法
或者,您可以将getCellEditor(…)
方法重写到表中,以获取编辑器,然后删除边框
另一种方法是向表中添加PropertyChangeListener
。然后,无论何时编辑单元格,您都将获得一个事件,这样您就可以获得活动编辑器并删除其边框:
@Override
public void propertyChange(PropertyChangeEvent e)
{
// A cell has started/stopped editing
if ("tableCellEditor".equals(e.getPropertyName()))
{
if (table.isEditing())
// add your code here
}
}
另外,为什么要使用CompoundBorder来创建EmptyBorder?再次感谢您抽出时间给出详细的答案。我使用了PropertyChangeListener
方法,现在它似乎可以工作了。我把它添加到主要问题中。如果可以的话,请告诉我我是否实施得很好。请放心,在现实世界中,我会检查活动编辑器的组件是否为JTextArea
类型,但这是出于测试目的。另外,昨晚在EmptyBorder上使用CompoundBorder是一个令人昏昏欲睡的错误,所以我纠正了它。另外,你知道如何给可编辑的JCombobox一个EmptyBorder吗?我在PropertyChangeListener
:combobox.setBorder(BorderFactory.createEmptyBorder())中执行了此操作,但仍然可以看到灰线边框。
DefaultCellEditor defaultEditor = (DefaultCellEditor) table.getDefaultEditor(columnClass);
System.out.println(defaultEditor.getClass());
@Override
public void propertyChange(PropertyChangeEvent e)
{
// A cell has started/stopped editing
if ("tableCellEditor".equals(e.getPropertyName()))
{
if (table.isEditing())
// add your code here
}
}