JFrame中,不同的的选项加载不同的JPanel,可是先选了“曲线图”,绘制完成,再选“直方图”绘制,刚画的直线还在图上。怎样去除刚刚画的直线呢?
下面的代码是我简化过的例子。谢谢各位大虾了:)import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class JPanelTest extends JFrame implements ActionListener{
/**
 * 
 */
private static final long serialVersionUID = 1L;
JButton buttonSelect;
JComboBox typeChoices = null;
    JPanel mainPanel= new JPanel();
    JPanel selectPanel= new JPanel();
    JPanel displayPanel= new JPanel();
    
    //Container contentPane=getContentPane();
    
public JPanelTest(){
this.setVisible(true); 
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setContentPane(mainPanel);
selectPanel.setLayout(new FlowLayout()); mainPanel.setLayout(new BorderLayout());
mainPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));

mainPanel.add(selectPanel,BorderLayout.NORTH);
        mainPanel.add(displayPanel,BorderLayout.CENTER);
        
        //Add a border around the select panel.
        selectPanel.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createTitledBorder("选择条件:"), 
            BorderFactory.createEmptyBorder(5,5,5,5)));
                //Add a border around the display panel.
        displayPanel.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createTitledBorder("显示结果:"), 
            BorderFactory.createEmptyBorder(5,5,5,5)));
        
//按钮
buttonSelect=new JButton("确定");
        buttonSelect.addActionListener(this);
        
        //ComboBox
        String[] phasesType = {"曲线图","直方图"};
        typeChoices = new JComboBox(phasesType);
        typeChoices.setSelectedIndex(0);
        
        selectPanel.add(Box.createRigidArea(new Dimension(10,0)));
        selectPanel.add(typeChoices);
       
        selectPanel.add(Box.createRigidArea(new Dimension(50,0)));
        selectPanel.add(buttonSelect);
        
        
}

public static void main(String args[]){new JPanelTest();} public void actionPerformed(ActionEvent e) {
//按下按钮
if (e.getSource()==buttonSelect){
//如果选择曲线图
     if(typeChoices.getSelectedIndex()==0){
     LineSinproSearch lineprosearch=new LineSinproSearch();
     lineprosearch.paint(this.getGraphics());
     displayPanel.removeAll();   
     displayPanel.add(lineprosearch,BorderLayout.CENTER);   
     displayPanel.revalidate();   
     displayPanel.repaint(); 
         displayPanel.setVisible(true);     }
            //如果选择直方图
     else if(typeChoices.getSelectedIndex()==1){
         //displayPanel.setVisible(true); 
         RectSinproSearch rectprosearch=new RectSinproSearch();
         rectprosearch.paint(this.getGraphics());
         displayPanel.removeAll();   
     displayPanel.add(rectprosearch,BorderLayout.CENTER);   
     displayPanel.revalidate();   
     displayPanel.repaint(); 
         displayPanel.setVisible(true);
     }

}
}

//曲线图类
class LineSinproSearch extends JPanel{ /**
 * 
 */
private static final long serialVersionUID = 1L;
public void paint(Graphics g) {
g.drawLine(100, 200, 300, 400);
}
}
//直方图类
class RectSinproSearch extends JPanel{ /**
 * 
 */
private static final long serialVersionUID = 1L;
public void paint(Graphics g) {
g.drawRect(100, 200, 100, 200);
}
}}

解决方案 »

  1.   

    先repaint;
    if (e.getSource()==buttonSelect)
    {
        displayPanel.revalidate();   
        displayPanel.repaint(); 
        .........
    }
      

  2.   

    如果有不同的JPanel来显示不同的图形,可以用panel.setVisible(false);让其不可见。其实可以用BufferedImage先把图画好,然后在同一个JPanel上显示出来。
      

  3.   

    那样就在button按下的一瞬间显示,release 按钮显示就消失了。
      

  4.   

    那样就在button按下的一瞬间显示,release 按钮显示就消失了。
      

  5.   

    不过为啥不用 JTabbedPane呢?
      

  6.   

    用setVisible(false)也不行,图也没有消失:(
    如果用BufferedImage,在多次选择加载后,也会存在在一个上面摞很多个的情况吧~~
      

  7.   

    JTabbedPane 不能达到想要的在一个页面显示的效果。
    我现在就是在那个ComboBox里加入了监听,一旦选择了,执行diaplayPanle.repaint();
    就是在选择显示种类的时候,下面的图就没了,一点确定,再出现新图。
    没有达到预想的在点确定才重画的效果~~