JPanel是轻量级的
Canvas是重量级的
不推荐重轻量级构件混用
表现上会有些区别

解决方案 »

  1.   

    to kypfos(大学里没有回忆)
    那如果要用Swing画图,有什么其他的办法?import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.sql.*;
    import java.util.*;class Mycanvas extends Canvas 
    {
    Mycanvas()
    {
    // setBackground(Color.white);//这行加后没用,背景还是灰色的
    getSize();
    } public void paint(Graphics g)
    {
                      g.drawOval(50,50,30,30);//这行是后来添的
    g.drawRect(30,30,40,40);
    g.drawOval(20,80,30,30);
    g.drawLine(30,30,70,70);//这行也是添的,编译运行后并没有变化
    } public Dimension getPreferredSize()
    {
    return new Dimension(300,200);
    }
    };class Panel_Input extends JPanel
    {
    JPanel p_data,p_button;
    JLabel
    label_number = new JLabel("活动号",JLabel.CENTER),
    label_name = new JLabel("活动名",JLabel.CENTER),
    label_preactive = new JLabel("前期工程",JLabel.CENTER),
    label_spendtime = new JLabel("花费时间",JLabel.CENTER),
    label_master = new JLabel("负责人",JLabel.CENTER);
    JTextField
    text_number = new JTextField(10),
    text_name = new JTextField(10),
    text_preactive = new JTextField(10),
    text_spendtime = new JTextField(10),
    text_master = new JTextField(10);
    JButton
    next = new JButton("下一个"),
    finish = new JButton("完成"); Panel_Input()
    {
    p_data = new JPanel();
    p_data.setLayout(new GridLayout(2,5));
    p_data.add(label_number);
    p_data.add(label_name);
    p_data.add(label_preactive);
    p_data.add(label_spendtime);
    p_data.add(label_master); p_data.add(text_number);
    p_data.add(text_name);
    p_data.add(text_preactive);
    p_data.add(text_spendtime);
    p_data.add(text_master); p_button = new JPanel();
    p_button.setLayout(new FlowLayout());
    p_button.add(next);
    p_button.add(finish); setLayout(new BorderLayout());
    add(p_data,BorderLayout.NORTH);
    add(p_button,BorderLayout.CENTER);
    }
    };class Panel_Output extends JPanel
    {
    Mycanvas canvas = new Mycanvas();
    JPanel info = new JPanel(); Panel_Output()
    {
    setLayout(new BorderLayout());
    add(canvas,BorderLayout.CENTER);
    add(info,BorderLayout.SOUTH);
    }
    };class MainFr extends JFrame implements ActionListener
    {
    Container contentpane;
    JMenuBar menubar;
    JMenu file,manage;
    JMenuItem create,open,edit,qury,exit;
    JSplitPane split;
    Panel_Input input;
    Panel_Output output;
    Object[][] active = new Object[30][5];
    Object columnName[]={"活动号","活动名","前期活动(活动号)","花费时间(天)","负责人"};
    JTable table = new JTable(active,columnName);
    JPanel p_button = new JPanel();
    JButton update = new JButton("更新"); MainFr()
    {
    super("工程进度控制系统");
    setVisible(true); menubar = new JMenuBar();
    file = new JMenu("文件");
    manage = new JMenu("管理");
    create = new JMenuItem("新建");
    open = new JMenuItem("打开");
    edit = new JMenuItem("编辑");
    qury = new JMenuItem("查询");
    exit = new JMenuItem("退出"); create.addActionListener(this);
    open.addActionListener(this);
    edit.addActionListener(this);
    qury.addActionListener(this);
    exit.addActionListener(this); file.add(create);
    file.add(open);
    file.addSeparator();
    file.add(exit); manage.add(edit);
    manage.add(qury); menubar.add(file);
    menubar.add(manage);
    setJMenuBar(menubar); contentpane = getContentPane();
    input = new Panel_Input();
    output = new Panel_Output();
    split = new JSplitPane(JSplitPane.VERTICAL_SPLIT,input,output);
    contentpane.add(split,BorderLayout.CENTER); pack();
    addWindowListener(new WindowAdapter()
    {
    public void windowClosing(WindowEvent e)
    {
    System.exit(0);
    }
    });
    } public void actionPerformed(ActionEvent e)
    {
    if(e.getSource()==create)
    {
    input.removeAll();
    }
    else if(e.getSource()==open)
    {}
    else if(e.getSource()==edit)
    {}
    else if(e.getSource()==qury)
    {
    input.removeAll();
    table.setPreferredScrollableViewportSize(new Dimension(550,50));
    input.add(new JScrollPane(table),BorderLayout.NORTH);

    p_button.setLayout(new FlowLayout());
    p_button.add(update); input.add(p_button,BorderLayout.CENTER);
    }
    else if(e.getSource()==exit)
    {
    System.exit(0);
    }
    }
    };public class Design 
    {
    public static void main(String[] args) 
    {
    MainFr frame = new MainFr();
    }
    }
      

  2.   

    该问题是由于awt组件没有preferedSize 建议值引起的,在JSplitePanel的拖动中需要获取建议值,最大值,最小值来判断是否可以拖动,在awt组件中没有这三个值的设置/获取方法,因此使用当前值,只能扩大,不能缩小,由于分割条已经到达上面的Panel的最小允许值了,因此无法拖动,如果你将分割位置调整到150的位置,你就会发现只能向上拖动,应证了以上说法.因此只要使用Swing控件来重画就可以了
      

  3.   

    怎样用Swing控件重画呢还有,为什么将画图部分去掉后,图形还留在上面.
      

  4.   

    swing中用JPanel代替吧swing中的构件大部分是继承自Container
    容器,可以任意的一层层叠放。在轻量级构件是用重量级构件会出现很多问主要体现在轻量级构件背景是透明比如重量级构件盖不了CheckBox,菜单等,相互覆盖的时候也会有问题。