【问题标题】:JComboBox hidden behind awt CanvasJComboBox 隐藏在 awt Canvas 后面
【发布时间】:2012-11-02 14:30:13
【问题描述】:

是的,我正在混合使用 awt 和 swing 组件,但也许有一个简单的解决方法,因为我不太了解 Java。

我的画布对象覆盖了绘制和更新:

package demo;
import java.awt.*;

public class rectangle extends Canvas {
    public rectangle() {
        this.setSize(500,300);
        this.setVisible(true);
    }
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.YELLOW);

        g2.fill3DRect(0, 0, 500, 300, true);
    }
    public void update(Graphics g) { paint(g); }
}

当我的 JComboBox 在上面打开时,它不会在上面绘制。例如,这是一个 JFrame,它演示了我在说什么:

package demo;
import javax.swing.*;
import java.util.*;
import java.awt.*;

public class ASframe extends JFrame {
    public ASframe() {
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        ArrayList listNames = new ArrayList();
        listNames.add("One");
        listNames.add("Two");
        listNames.add("Three");
        listNames.add("Four");

        rectangle r = new rectangle();
        JComboBox listBox = new JComboBox(listNames.toArray());
        listBox.setVisible(true);

        JPanel listPane = new JPanel();
        listPane.setLayout(new BoxLayout(listPane, BoxLayout.PAGE_AXIS));
        listPane.add(listBox);
        listPane.add(r);

        this.setResizable(false);
        this.add(listPane);
        this.pack();
    }
    public static void main(String arg[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ASframe().setVisible(true);
            }
        });
    }
}

真正有趣的是,如果矩形比 JComboBox 小,则完全没有问题。因此,将矩形更改为 300x20 即可正常工作。

提前致谢。

【问题讨论】:

  • "是的,我正在混合 awt 和 swing 组件,但也许"..不,不要混合重量级和轻量级 UI 对象。
  • 用 JPanel 代替 Canvas,更好的paintComponent i.o.油漆。
  • 好的,带有 setPreferredSize 的 JPanel 似乎满足了我的需求。感谢你们两位的快速回复!
  • @mre 混合不再是问题(因为 jdk6 更新发布较晚),但同意:除非有迫切需要,否则不要。
  • setPreferredSize 似乎满足了我的需要 那么你在某处做错了什么:作为一般规则,do not use any of the setXXSize methods,而是酌情覆盖 getXXSize。顺便说一句:请学习 java 命名约定并遵守它们。

标签: java swing awt mixing


【解决方案1】:

尝试告诉 Swing 使用重量级组件,看看是否可行。

JComboBox listBox = new JComboBox(listNames.toArray());
listBox.setVisible(true);

// additional line below    
listBox.setLightWeightPopupEnabled(false); // use heavyweight component

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多