Checkbox AWT重绘问题
我正在尝试对一些不支持swing的旧java代码进行一些小的添加。我需要添加一个小对话框,其中包含一个面板,其中有一个复选框和一对文本字段。当用户单击复选框时,我想禁用或启用复选框。这一部分似乎工作正常,但文本字段没有正确地重新绘制。当我单击复选框时,字段不会显示为已启用,但如果我随后单击面板或文本字段,您会看到它们已启用(相反,当我取消选中复选框时,字段仍会显示为已启用,直到您尝试并单击它们,它们会变为重影且不会被选中)。我使用setEnabled(布尔值)设置字段的状态。在更改状态后,我尝试在字段和面板上调用repaint和validate,但这似乎不起作用。我也尝试过让fields request聚焦,但没有成功。有人有其他想法吗Checkbox AWT重绘问题,checkbox,panel,awt,textfield,Checkbox,Panel,Awt,Textfield,我正在尝试对一些不支持swing的旧java代码进行一些小的添加。我需要添加一个小对话框,其中包含一个面板,其中有一个复选框和一对文本字段。当用户单击复选框时,我想禁用或启用复选框。这一部分似乎工作正常,但文本字段没有正确地重新绘制。当我单击复选框时,字段不会显示为已启用,但如果我随后单击面板或文本字段,您会看到它们已启用(相反,当我取消选中复选框时,字段仍会显示为已启用,直到您尝试并单击它们,它们会变为重影且不会被选中)。我使用setEnabled(布尔值)设置字段的状态。在更改状态后,我尝试
//The class that contains all of this is of type Window
//Declaration of the components
private Panel _inputPanel;
private TextField min , max;
//This method adds to two text fields
public void addMinMaxtextFields(String min, String max) {
TextField minField = new TextField(min);
TextField maxField = new TextField(max);
this.min = minField;
this.max = maxField;
this.min.setEnabled(false);
this.max.setEnabled(false);
_inputPanel.add(minField);
_inputPanel.add(maxField);
}
//listener for the checkbox
public void itemStateChanged(ItemEvent e) {
Component[] components = _inputPanel.getComponents();
min.setEnabled(!min.isEnabled());
min.setVisible(true);
min.validate();
min.repaint();
_inputPanel.validate();
_inputPanel.repaint();
this.pack();
this.setSize(this.getWidth(), this.getHeight());
this.validate();
this.repaint();
/* do nothing */
}
在调用setEnabled(布尔)后,您需要在面板上调用update(图形g) 检查: 我尝试了以下代码(根据您提供的代码构建),它工作正常
import java.awt.Checkbox;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class CheckUI extends Dialog implements ItemListener {
// The class that contains all of this is of type Window
// Declaration of the components
private Panel _inputPanel;
private TextField min, max;
private Checkbox cb;
public CheckUI(Frame owner, boolean modal) {
super(owner, modal);
_inputPanel = new Panel();
this.add(_inputPanel);
addMinMaxtextFields("min", "max");
}
// This method adds to two text fields
public void addMinMaxtextFields(String min, String max) {
cb = new Checkbox();
cb.addItemListener(this);
TextField minField = new TextField(min);
TextField maxField = new TextField(max);
this.min = minField;
this.max = maxField;
this.min.setEnabled(false);
this.max.setEnabled(false);
_inputPanel.add(minField);
_inputPanel.add(maxField);
_inputPanel.add(cb);
}
// listener for the checkbox
public void itemStateChanged(ItemEvent e) {
Component[] components = _inputPanel.getComponents();
min.setEnabled(!min.isEnabled());
min.setVisible(true);
min.validate();
min.repaint();
_inputPanel.validate();
_inputPanel.repaint();
this.pack();
this.setSize(this.getWidth(), this.getHeight());
this.validate();
this.repaint();
/* do nothing */
}
/**
* @param args
*/
public static void main(String[] args) {
Frame parent = new Frame();
parent.setVisible(true);
parent.setExtendedState(Frame.MAXIMIZED_BOTH);
parent.pack();
CheckUI ui = new CheckUI(parent, true);
ui.pack();
ui.setVisible(true);
}
}
在调用setEnabled(布尔)后,您需要在面板上调用update(图形g) 检查: 我尝试了以下代码(根据您提供的代码构建),它工作正常
import java.awt.Checkbox;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class CheckUI extends Dialog implements ItemListener {
// The class that contains all of this is of type Window
// Declaration of the components
private Panel _inputPanel;
private TextField min, max;
private Checkbox cb;
public CheckUI(Frame owner, boolean modal) {
super(owner, modal);
_inputPanel = new Panel();
this.add(_inputPanel);
addMinMaxtextFields("min", "max");
}
// This method adds to two text fields
public void addMinMaxtextFields(String min, String max) {
cb = new Checkbox();
cb.addItemListener(this);
TextField minField = new TextField(min);
TextField maxField = new TextField(max);
this.min = minField;
this.max = maxField;
this.min.setEnabled(false);
this.max.setEnabled(false);
_inputPanel.add(minField);
_inputPanel.add(maxField);
_inputPanel.add(cb);
}
// listener for the checkbox
public void itemStateChanged(ItemEvent e) {
Component[] components = _inputPanel.getComponents();
min.setEnabled(!min.isEnabled());
min.setVisible(true);
min.validate();
min.repaint();
_inputPanel.validate();
_inputPanel.repaint();
this.pack();
this.setSize(this.getWidth(), this.getHeight());
this.validate();
this.repaint();
/* do nothing */
}
/**
* @param args
*/
public static void main(String[] args) {
Frame parent = new Frame();
parent.setVisible(true);
parent.setExtendedState(Frame.MAXIMIZED_BOTH);
parent.pack();
CheckUI ui = new CheckUI(parent, true);
ui.pack();
ui.setVisible(true);
}
}
你能添加一些代码段吗?很抱歉,我遇到了紧急情况,不在家,我添加了代码段。你能添加一些代码段吗?很抱歉,我遇到了紧急情况,不在家,我添加了代码段。嗯,这似乎不管用。谢谢你的建议。@Mike2012我认为这不是完整的代码。我还需要理解完全缺失的与复选框相关的代码。我的windows是一个对话框而不是一个框架,当我将其切换到框架时,它工作了。不幸的是,没有办法使框架成为模态,你知道为什么这是一个框架而不是一个对话框会改变这种情况吗?@Mike2012 OK。。。我试着让它成为模态对话框。更新了我的答案。。。它起作用了:)嗯,这似乎不起作用。谢谢你的建议。@Mike2012我认为这不是完整的代码。我还需要理解完全缺失的与复选框相关的代码。我的windows是一个对话框而不是一个框架,当我将其切换到框架时,它工作了。不幸的是,没有办法使框架成为模态,你知道为什么这是一个框架而不是一个对话框会改变这种情况吗?@Mike2012 OK。。。我试着让它成为模态对话框。更新了我的答案。。。有效:)