Java awt.canvas在JScrollPane中时未剪裁
我有一个JScrollPane,它的视口中有一个JPanel,里面有许多较小的JPanel,最里面的每个JPanel中都有一个awt.Canvas 将JScrollPane滚动到任何画布跨越JScrollPane边界的位置时,画布将在边界外绘制;在JScrollPane区域外的屏幕上可见 我本以为画布会自动剪裁,但显然情况并非如此。我是否必须手动设置剪裁,或者是否有另一种方法可以自动在JScrollPane边框处剪裁画布?因为我仍然建议不要在没有最重要原因的情况下将AWT和Swing组件混合在一起 也许可以用这段代码重现Java awt.canvas在JScrollPane中时未剪裁,java,swing,canvas,awt,jscrollpane,Java,Swing,Canvas,Awt,Jscrollpane,我有一个JScrollPane,它的视口中有一个JPanel,里面有许多较小的JPanel,最里面的每个JPanel中都有一个awt.Canvas 将JScrollPane滚动到任何画布跨越JScrollPane边界的位置时,画布将在边界外绘制;在JScrollPane区域外的屏幕上可见 我本以为画布会自动剪裁,但显然情况并非如此。我是否必须手动设置剪裁,或者是否有另一种方法可以自动在JScrollPane边框处剪裁画布?因为我仍然建议不要在没有最重要原因的情况下将AWT和Swing组件混合在一
import java.awt.*;
import javax.swing.*;
public class AwtSwing {
private JPanel panel = new JPanel(new GridLayout(8, 8, 10, 10));
public AwtSwing() {
for (int i = 0; i < 36; i++) {
Canvas cnv = new Canvas();
JPanel panelInner = new JPanel(new BorderLayout());
panelInner.add(cnv, BorderLayout.CENTER);
panel.add(panelInner);
}
JFrame f = new JFrame("JTableExample");
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.add(new JScrollPane(panel), BorderLayout.CENTER);
f.pack();
f.setLocation(150, 150);
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
AwtSwing awtSwing = new AwtSwing();
}
});
}
}
import java.awt.*;
导入javax.swing.*;
公共级AwtSwing{
私有JPanel面板=新JPanel(新网格布局(8,8,10,10));
公共AwtSwing(){
对于(int i=0;i<36;i++){
Canvas cnv=新画布();
JPanel panelInner=newjpanel(newborderlayout());
panelInner.add(cnv,BorderLayout.CENTER);
面板。添加(面板内部);
}
JFrame f=新的JFrame(“JTableExample”);
f、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f、 添加(新的JScrollPane(面板),BorderLayout.CENTER);
f、 包装();
f、 设置位置(150150);
f、 setVisible(真);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
AwtSwing AwtSwing=新的AwtSwing();
}
});
}
}
您必须以演示您的问题的形式在此处发布代码。您应该使用最新的jdk版本(正如@mKorbel已经指出的)您是对的,问题在于awt与Swing的混合。扩展JPanel而不是awt.Canvas,并将paint(Graphics g)方法重命名为paintComponent(Graphics g),解决了剪切问题。