【问题标题】:AWT repaint issuesAWT 重绘问题
【发布时间】:2010-08-14 13:39:08
【问题描述】:

我正在尝试对一些不支持 swing 的旧 Java 代码做一些小的补充。我需要添加一个小对话框,其中包含一个面板,该面板有一个复选框和几个文本字段。当用户单击复选框时,我想禁用或启用复选框。这部分似乎运行良好,但文本字段未正确重绘。当我单击复选框时,字段似乎没有启用,但是如果我然后单击面板或文本字段,您会看到它们已启用(反之亦然,当我取消选中复选框时,字段看起来仍然已启用直到您尝试单击它们并且它们变成幻影并且不会被选中)。我使用 setEnabled(boolean) 来设置字段的状态。更改状态后,我尝试在字段和面板上调用重绘和验证,但这似乎不起作用。我也试图让字段请求焦点,但这没有用。有人有其他想法吗?

 //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 */
}

【问题讨论】:

  • 你能添加一些代码sn-ps吗?
  • 对不起,我有紧急情况已经离开,我添加了代码sn-ps。

标签: checkbox panel awt textfield


【解决方案1】:

在调用 setEnabled(boolean) 后,您需要在 Panel 上调用 update(Graphics g)。

检查: http://download-llnw.oracle.com/javase/1.4.2/docs/api/java/awt/Container.html#update(java.awt.Graphics)

我尝试了以下代码(根据您提供的代码构建),它工作正常。

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 我不认为这是完整的代码。我还需要了解完全缺失的复选框相关代码。
  • 我的窗口是一个对话框而不是一个框架,当我把它切换到一个框架时,它就起作用了。
  • 不幸的是,没有办法让框架成为模态,你知道为什么这是一个框架而不是一个对话框会改变这种情况吗?
  • @Mike2012 好的...我试图让它成为模态对话框。更新了我的答案......它的工作原理:)
猜你喜欢
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
相关资源
最近更新 更多