gpt4 book ai didi

java - 将 Swing GUI 组件的属性绑定(bind)到自定义类方法(属性)

转载 作者:行者123 更新时间:2023-11-29 05:56:13 33 4
gpt4 key购买 nike

我正在处理我的聊天项目。我已经编写了无需 GUI 即可工作的服务器端和客户端,只需控制台 UI。现在,在处理客户端 GUI 时(使用 Netbeans 提供的工具,而不是我自己编写代码的习惯),我一直在解决绑定(bind)问题。

ClientGui 类中,我有 Client 对象。在我的 GUI 中,我想禁用输入文本字段,直到客户端未连接到聊天服务器。我已尝试将启用的输入文本字段属性绑定(bind)(通过 Netbeans GUI)到该客户端对象的方法 isConnected()(返回 boolean)。 isConnected 不只是返回一些变量的值,它是组合的 boolean 表达式。因此,当用户单击连接时,它会成功,但输入文本字段不会将其状态更改为已启用。

因此,据我了解,我必须在我的 Client 类中处理事件和监听器并进行通知?但是绑定(bind)的重点是什么,因为我可以在我的 Client 上触发事件并且我的输入字段监听客户端连接的事件?

所以我提供了我的代码块。

Client 类:(您可能会看到一些带有 Action 监听器和事件的行,我没有删除它们,只是进行了试验)

public class Client {
private ClientListener listener;
private ClientSender sender;
private Socket connection;

private boolean finnish = false;
private PropertyChangeEvent connected;

public Client(String hostname, int port) throws UnknownHostException, IOException {
connection = new Socket(hostname, port);
}

public void start() {
try {
connected = new PropertyChangeEvent(this, "connected", null, connection);

sender = new ClientSender(new ObjectOutputStream(connection.getOutputStream()));
Thread senderThread = new Thread(sender);
senderThread.start();
Logger.getLogger(Client.class.getName()).log(Level.INFO, "Sender thread has started");

listener = new ClientListener(new ObjectInputStream(connection.getInputStream()));
Thread listenerThread = new Thread(listener);
listenerThread.start();
Logger.getLogger(Client.class.getName()).log(Level.INFO, "Listener thread has started");


} catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, "IO problems", ex);
}
}

public ClientSender getSender() {
return sender;
}

public void stop() {
sender.stop();
listener.stop();
}

public boolean isConnected() {
return connection != null && !connection.isClosed();
}
}

Client GUI 类:

public class ClientGui extends javax.swing.JFrame {
private Client client;

public boolean getConnected() {
System.out.println( client != null && client.isConnected());
return client != null && client.isConnected();
}

/**
* Creates new form ClientGui
*/
public ClientGui() {
initComponents();
}

// GENERATED CODE

private void tfUserInputKeyPressed(java.awt.event.KeyEvent evt) {
if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
Message message = new Message("user", tfUserInput.getText());
client.getSender().add(message);

tfUserInput.setText("");
}
}

private void btnConnectActionPerformed(java.awt.event.ActionEvent evt) {
try {
client = new Client(tfHostname.getText(), Integer.parseInt(tfPort.getText()));
client.start();

} catch (UnknownHostException ex) {
Logger.getLogger(ClientGui.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(ClientGui.class.getName()).log(Level.SEVERE, null, ex);
}

}

// and somewhere GUI generated code of my binding (also tried with custom code, but no success)
org.jdesktop.beansbinding.Binding binding =
org.jdesktop.beansbinding.Bindings.createAutoBinding
(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ, this,
org.jdesktop.beansbinding.ELProperty.create("${connected}"), listConversation,
org.jdesktop.beansbinding.BeanProperty.create("enabled"), "listConversationBinding");

bindingGroup.addBinding(binding);

实际上它是一个JList,但没关系,因为我希望对少数组件进行这样的绑定(bind)。在这里,我尝试在 GUI Form 中使用假方法,它调用连接的客户端(这样做是因为没有如何将 Client 添加为组件)。

我在论坛上看到过,到处都在谈论 bean 等等。我希望我的 Client 类具有尽可能少的 GUI、接口(interface)实现和触发事件调用等所需的代码。

更新

很好!谢谢。为什么我不能绑定(bind),所以我不必使用 setEnabled(value) 方法(使启用的属性跟踪 boolean 表达式“property”(connection != null && !connection .isClosed())。此外,由于这个技巧,我必须执行 setConnected(value),即使这是在运行时根据连接解决的,我什至不能知道旧值(当然我可以做 private void setConnected(booleanvalue) 并根据那些地方发生的事情用 true 或 false 调用这个。似乎我使用属性的想法是错误的,更好处理 Action 或事件。

最佳答案

您应该将 PropertyChangeSupport 添加到 Client

    final PropertyChangeSupport pcs = new PropertyChangeSupport(this);

public void addPropertyChangeListener(PropertyChangeListener listener) {
this.pcs.addPropertyChangeListener(listener);
}


boolean connected;

public boolean isConnected() {
return connected;
}

public void setConnected(boolean connected) {
boolean oldValue = this.connected;
this.value = connected;
this.pcs.firePropertyChange("connected", oldValue, newValue);
}

.....


public Client(String hostname, int port) throws UnknownHostException, IOException {
connection = new Socket(hostname, port);
setConnected(connection != null && !connection.isClosed());
}

在图形用户界面中

    public class ClientGui extends javax.swing.JFrame implements PropertyChangeListener
.....
propertyChanged(..){
tfUserInput.setEnabled(true);
}

private void btnConnectActionPerformed(java.awt.event.ActionEvent evt) {
try {
client = new Client(tfHostname.getText(), Integer.parseInt(tfPort.getText()));
client.addPropertyChangeListener(this);
client.start();
.....

关于java - 将 Swing GUI 组件的属性绑定(bind)到自定义类方法(属性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12011217/

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