Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 隐藏在awt画布后面的JComboBox_Java_Swing_Awt_Mixing - Fatal编程技术网

Java 隐藏在awt画布后面的JComboBox

Java 隐藏在awt画布后面的JComboBox,java,swing,awt,mixing,Java,Swing,Awt,Mixing,是的,我混合了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(

是的,我混合了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,它将按预期工作


提前感谢。

试着告诉Swing使用重量级组件,看看是否有效

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

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

“是的,我正在混合awt和swing组件,但可能”.不,不要混合重量级和轻量级UI对象。使用JPanel代替Canvas,使用更好的paintComponent I.o.paint。好的,设置PreferredSize的JPanel似乎满足了我的需要。谢谢你们两位的快速回复@mre混合已不再是一个问题(因为jdk6更新版本已经很晚了),但请同意:除非有迫切的需要,否则不要这样做。setPreferredSize似乎满足了我的需要,然后您在某个地方做错了什么:一般来说,应该根据需要覆盖getXXSize。顺便说一句:请学习java命名约定并坚持它们。谢谢。很好