我有两个简单的类:
public class Customer
{
public String CustomerID { get; set; }
public String Forename { get; set; }
public String Surname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和
public class Order
{
public String OrderID { get; set; }
public Decimal Value { get; set; }
public Customer OrderedBy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我创建一个 Customer 对象列表:
List<Customer> customers = new List<Customer>();
customers.Add(new Customer() { CustomerID = "1", Forename = "John", Surname = "Smith"});
customers.Add(new Customer() { CustomerID = "2", …Run Code Online (Sandbox Code Playgroud) 让我首先解释一下我想要实现的目标。我正在 Swing 中创建一个数据输入表单,由许多 JComboBox 和 JTextField 组成。验证例程迭代这些组件并确定为每个控件指定的值是否“有效”(验证的详细信息与本示例的目的无关)。
当例程识别出某个组件包含无效值时,我想更改该字段的背景颜色以及该字段的前景/文本颜色 - 让用户清楚该字段存在问题。
在字段被视为“有效”的情况下,我想将控件的背景设置为白色 - 并将前景/文本设置为黑色。
到目前为止,所有这些都非常简单,并且都可以在下面附加的演示代码中实现。
当组合框包含有效值并且获得焦点时,组合内编辑器的背景将设置为蓝色,我对此非常满意。
但是,我想要实现的是当组合框包含无效值时更改用于突出显示聚焦组合框的颜色。尽管已将组合框的背景颜色更改为粉红色,但如果控件获得焦点,它仍然使用蓝色来指示它获得焦点。
聚焦的无效字段示例: http://postimg.org/image/ne9xgjch3/
尽管我明白这是完全正常的行为,但我想做的是将用于突出显示“无效”字段之一的颜色更改为非聚焦和无效控件所具有的较暗颜色- 这样用户仍然可以看到哪个控件获得焦点,并且它仍然是粉红色的。我明白这可能看起来很小,但我的最终用户坚持认为在聚焦时整个字段保持粉红色(或者更确切地说,不同色调的粉红色)。这就是我的乌托邦,一个集中且“无效”的领域,看起来像这样:
http://postimg.org/image/9793bqcfj/
我尝试扩展 DefaultListCellRenderer 和 BasicComboBoxEditor 类,并将它们分别针对组合框设置为渲染器和编辑器。我的印象是编辑器将是我需要集中注意力的地方,因此在类的 getEditorComponent 方法中,我将返回一个具有适当背景和前景的标签 - 但是在该方法中,我无法知道控件是否具有焦点,因此无法确定应如何格式化返回的标签。此外,一旦我开始针对组合框设置编辑器,我似乎就完全失去了集中控制的能力 - 尽管这可能是因为我缺乏如何实现编辑器的知识。
我也一直在阅读有关 BasicComboBoxUI 的内容,但我遇到的任何解决方案都不是突出的。
请有人好心地为我指明正确的方向,我花了几天时间修补这个问题,这真的开始让我烦恼。请原谅 netbeans 生成的演示代码,它只是为了让我快速拼凑出一个演示。
package com.test;
import java.awt.*;
public class TestForm extends javax.swing.JFrame {
public TestForm()
{
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
cboOne = new javax.swing.JComboBox();
txtOne = new javax.swing.JTextField();
txtTwo = new javax.swing.JTextField();
btnValidate = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); …Run Code Online (Sandbox Code Playgroud)