当前位置:编程学习 > JAVA >>

绘图时很奇怪覆盖现象,苦闷好久,求救!谢谢!

我做一个演示插补法的程序,框架里有两个面板,左面板用于绘图,右面板用于采集输入,问题有:
1,运行程序后界面上什么都没有,最大化一次后里面的组件才出来,对话框走哪儿哪儿就没了
2,点击菜单弹出对话框后,左面板被破坏,好像露出了背景色?
3,点击“确定”按钮后绘图开始,可是左面板图没出来却把右面板所有东西复制过去了,实在不解哪里出了问题?(重点问题)
部分代码:.....
        //面板添加
        Caidan dan=new Caidan();
        setJMenuBar(dan);
        
        dangliang=new Dangliang(this,"设置当量",false);
        shijian=new Shijian(this,"间隔时间",false);
        guanyu=new Guanyu(this,"关于我们",false);
        shuru=new Shuru(this);
        jisuan=new Jisuan(shuru);
        huabu=new Huitu ();      
        huabu.jiji=jisuan;
        
        content.setLayout(new GridLayout(1,2,5,0));
        content.add(huabu);
        content.add(shuru);  
        .......
        //事件处理
        if(evt.getSource()==shuru.b){
            jisuan.main();            
            huabu.huan();
            huabu.repaint();            
        }
        .......
        //左面板 类
          class Huitu extends JPanel{
    
    int[][] z;
    int N;
    Jisuan jiji;
    
    public Huitu(){
        super();
        z=new int[60][2];
    }
    public void huan(){
        for(int i=0;i<=59;i++){
            this.z[i][0]=jiji.a[i][0];
            this.z[i][1]=jiji.a[i][1];
        }
    }
    
    @Override
    public void paint(Graphics comp){
        Graphics comp2D=(Graphics2D)comp .create();        
        comp2D.setColor(Color.red);        
        comp2D.drawLine(50*z[0][0], 50*z[0][1], 50*z[N][0], 50*z[N][1]);        
        for(int i=0;i<=N-1;i++){
               comp2D.drawLine(50*z[i][0],50*z[i][1],50*z[i+1][0],50*z[i+1][1]);
        }
    }
} 框架 2d 界面 --------------------编程问答-------------------- 在相同的一个点处如果有两个控件同时处于显示状态,但是页面只能显示一个。那么GUI会怎么处理呢?
一般情况下是先添加的组件覆盖后添加的组件。但是如果第二个组件有调用的话好像第二个组件就显示出来了。。
所以我的做法一般是尽量让两个组件之间相互不覆盖。即使覆盖,也尽量把一个的背景设为透明色。 --------------------编程问答-------------------- 这当初我学C#的GUI的时候也遇到过类似问题。 --------------------编程问答--------------------
引用 1 楼 AA5279AA 的回复:
在相同的一个点处如果有两个控件同时处于显示状态,但是页面只能显示一个。那么GUI会怎么处理呢?
一般情况下是先添加的组件覆盖后添加的组件。但是如果第二个组件有调用的话好像第二个组件就显示出来了。。
所以我的做法一般是尽量让两个组件之间相互不覆盖。即使覆盖,也尽量把一个的背景设为透明色。

我的代码粘少了,你可能没发现,我的左右面板是分开的,各占一半,应该不会重叠呀
//主类的构造函数部分代码

package chabufa;
import java.awt.*;
import java.awt.event.*;


import javax.swing.*;

public class Chabufa extends JFrame implements ActionListener{
    JMenuBar caidan;
    JMenu c1,c2,c3;
    JMenuItem m1,m2,m3,f1,f2,f3,f4,f5,f6,s1,s2,c33;
    
    Dangliang dangliang;
    Shijian shijian;
    Guanyu guanyu;
    
    Huitu huabu;//左面板绘图类
    Shuru shuru;//右面板输入类
    Jisuan jisuan;//数据处理类
    
    public Chabufa(){
        super("数控插补法");
        setSize(1000,600);     
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
        setVisible(true);
        //setBackground(Color.gray);
        Container content=getContentPane();
        
        Caidan dan=new Caidan();//菜单类
        setJMenuBar(dan);
        
        dangliang=new Dangliang(this,"设置当量",false);
        shijian=new Shijian(this,"间隔时间",false);
        guanyu=new Guanyu(this,"关于我们",false);
        shuru=new Shuru(this);
        jisuan=new Jisuan(shuru);
        huabu=new Huitu ();      
        huabu.jiji=jisuan;
        
        content.setLayout(new GridLayout(1,2,5,0));
        content.add(huabu);
        content.add(shuru);        
        ......
        如果需要,我把txt格式文件发给你,你用软件运行一下看看是怎么错了,谢谢 --------------------编程问答--------------------
引用 3 楼 u010994470 的回复:
Quote: 引用 1 楼 AA5279AA 的回复:

在相同的一个点处如果有两个控件同时处于显示状态,但是页面只能显示一个。那么GUI会怎么处理呢?
一般情况下是先添加的组件覆盖后添加的组件。但是如果第二个组件有调用的话好像第二个组件就显示出来了。。
所以我的做法一般是尽量让两个组件之间相互不覆盖。即使覆盖,也尽量把一个的背景设为透明色。

我的代码粘少了,你可能没发现,我的左右面板是分开的,各占一半,应该不会重叠呀
//主类的构造函数部分代码

package chabufa;
import java.awt.*;
import java.awt.event.*;


import javax.swing.*;

public class Chabufa extends JFrame implements ActionListener{
    JMenuBar caidan;
    JMenu c1,c2,c3;
    JMenuItem m1,m2,m3,f1,f2,f3,f4,f5,f6,s1,s2,c33;
    
    Dangliang dangliang;
    Shijian shijian;
    Guanyu guanyu;
    
    Huitu huabu;//左面板绘图类
    Shuru shuru;//右面板输入类
    Jisuan jisuan;//数据处理类
    
    public Chabufa(){
        super("数控插补法");
        setSize(1000,600);     
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
        setVisible(true);
        //setBackground(Color.gray);
        Container content=getContentPane();
        
        Caidan dan=new Caidan();//菜单类
        setJMenuBar(dan);
        
        dangliang=new Dangliang(this,"设置当量",false);
        shijian=new Shijian(this,"间隔时间",false);
        guanyu=new Guanyu(this,"关于我们",false);
        shuru=new Shuru(this);
        jisuan=new Jisuan(shuru);
        huabu=new Huitu ();      
        huabu.jiji=jisuan;
        
        content.setLayout(new GridLayout(1,2,5,0));
        content.add(huabu);
        content.add(shuru);        
        ......
        如果需要,我把txt格式文件发给你,你用软件运行一下看看是怎么错了,谢谢

给你一个建议吧
content.setLayout(null);//布局管理器置空,
大小设置为不可变。
然后里面的两个大的组件用setBounds来设置绝对坐标。两个组件评分frame
你看这样是否还重叠,如果不会,那么就是你布局管理器的问题,如果会,那么就是你大组件下小组件的重叠问题 --------------------编程问答--------------------
引用 4 楼 AA5279AA 的回复:
Quote: 引用 3 楼 u010994470 的回复:

Quote: 引用 1 楼 AA5279AA 的回复:

在相同的一个点处如果有两个控件同时处于显示状态,但是页面只能显示一个。那么GUI会怎么处理呢?
一般情况下是先添加的组件覆盖后添加的组件。但是如果第二个组件有调用的话好像第二个组件就显示出来了。。
所以我的做法一般是尽量让两个组件之间相互不覆盖。即使覆盖,也尽量把一个的背景设为透明色。

我的代码粘少了,你可能没发现,我的左右面板是分开的,各占一半,应该不会重叠呀
//主类的构造函数部分代码

package chabufa;
import java.awt.*;
import java.awt.event.*;


import javax.swing.*;

public class Chabufa extends JFrame implements ActionListener{
    JMenuBar caidan;
    JMenu c1,c2,c3;
    JMenuItem m1,m2,m3,f1,f2,f3,f4,f5,f6,s1,s2,c33;
    
    Dangliang dangliang;
    Shijian shijian;
    Guanyu guanyu;
    
    Huitu huabu;//左面板绘图类
    Shuru shuru;//右面板输入类
    Jisuan jisuan;//数据处理类
    
    public Chabufa(){
        super("数控插补法");
        setSize(1000,600);     
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
        setVisible(true);
        //setBackground(Color.gray);
        Container content=getContentPane();
        
        Caidan dan=new Caidan();//菜单类
        setJMenuBar(dan);
        
        dangliang=new Dangliang(this,"设置当量",false);
        shijian=new Shijian(this,"间隔时间",false);
        guanyu=new Guanyu(this,"关于我们",false);
        shuru=new Shuru(this);
        jisuan=new Jisuan(shuru);
        huabu=new Huitu ();      
        huabu.jiji=jisuan;
        
        content.setLayout(new GridLayout(1,2,5,0));
        content.add(huabu);
        content.add(shuru);        
        ......
        如果需要,我把txt格式文件发给你,你用软件运行一下看看是怎么错了,谢谢

给你一个建议吧
content.setLayout(null);//布局管理器置空,
大小设置为不可变。
然后里面的两个大的组件用setBounds来设置绝对坐标。两个组件评分frame
你看这样是否还重叠,如果不会,那么就是你布局管理器的问题,如果会,那么就是你大组件下小组件的重叠问题

不能,我试了一下,所有组件都没了,就剩一个框架(菜单还在)了 --------------------编程问答-------------------- 哥哥姐姐们,代码过多不能在这儿展示,我粘贴到TXT文档上传到我的资源里,请屈驾到小弟资源处下载,用软件试一试,帮忙解开这个谜吧,谢谢
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,