gpt4 book ai didi

java - 在某些情况下,删除 JTextField 单元格编辑器的边框不起作用

转载 作者:行者123 更新时间:2023-11-30 02:18:57 25 4
gpt4 key购买 nike

由于出现了以下问题,此问题是此问题的后续问题:Remove cell editor border in JTable (Windows LaF)

当我从 DefaultCellEditor#getComponent() 获取的 JTextArea 已经位于表格上时修改其边框时,我遇到了意外行为。边框在视觉上上根本不会改变。

即使在调用之后:

textField.setBorder(BorderFactory.createCompoundBorder(null, BorderFactory.createEmptyBorder(1, 1, 1, 1)));

然后就做:

System.out.println(textField.getBorder());

控制台显示javax.swing.border.CompoundBorder@6aff616,这意味着边框已在内部发生更改。然而,这并没有在视觉上反射(reflect)出来,我很困惑。

我的测试类:

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;

最后,这是一个令人讨厌的解决方法,它可以工作但不可行:

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);
}
}

最后,有一些更好的东西可以工作(感谢 Camickr!)

table.addPropertyChangeListener((evt) -> {
if ("tableCellEditor".equals(evt.getPropertyName())) {
if (table.isEditing()) {
JTextField jtextField = (JTextField) ((DefaultCellEditor) table.getCellEditor()).getComponent();
jtextField.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
}
}
});

最佳答案

DefaultCellEditor defaultEditor = (DefaultCellEditor) table.getDefaultEditor(columnClass);
System.out.println(defaultEditor.getClass());

将上述语句添加到您的代码中,您将看到默认编辑器是 GenericEditor,它是 JTable 的内部类。

此编辑器添加了在 JTable 中使用的额外功能。

它所做的事情之一就是管理边境。如果发现错误,编辑器中会显示“红色边框”。否则边框将设置为默认的“黑色边框”。

And finally here is a nasty workaround that makes it work but isn't viable:

您需要使用 DefaultCellEditor 或创建自定义编辑器。

您也许能够扩展 JTable.GenericEditor 类并重写 getTableCellEditor(...) 方法。这是将边框重置为默认黑色边框的方法。

或者您可以重写表格的 getCellEditor(...) 方法来获取编辑器,然后删除边框。

另一种方法是将 PropertyChangeListener 添加到表中。然后,每当编辑单元格时,您都会收到一个事件,以便您可以获得 Activity 编辑器并删除其边框:

@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?

关于java - 在某些情况下,删除 JTextField 单元格编辑器的边框不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47420514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com