我的主程序里pane面板上使用BorderLayout布局方式在North部分有三个JButton,分别可调用三个不同JFrame使其组件显示在pane的West部分面板上但在切换时虽然新显示的组件覆盖了旧的组件,但点击其中组件时(均有事件响应)仍为旧的组件的事件响应应该是要把原来旧的组件remove掉,再绘制新的组件,怎么搞??

解决方案 »

  1.   

    用remove掉  也行 ~     用setVisible也行吧    我感覺用JFrame會不會有標題欄什么的    用個panel也挺好啊 ~~
      

  2.   

    不明白,jframe是顶层容器啊!!
      

  3.   

    事件响应的部分程序是:
    if (ae.getSource() == btnMP1)
        {
    MPWestPanel1 test1 = new MPWestPanel1() ;
    JScrollPane scrollPane = new JScrollPane(test1.getComponent()) ;
    pane.add(scrollPane,BorderLayout.WEST) ;
    pane.setVisible(true) ;
    validate() ;
    }
    if (ae.getSource() == btnMP2)
        {
    MPWestPanel2 test2 = new MPWestPanel2() ;
    JScrollPane scrollPane = new JScrollPane(test2.getComponent()) ;
    pane.add(scrollPane,BorderLayout.WEST) ;
    pane.setVisible(true) ;
    validate() ;
    }
    if (ae.getSource() == btnMP3)
        {
    MPWestPanel3 test3 = new MPWestPanel3() ;
    JScrollPane scrollPane = new JScrollPane(test3.getComponent()) ;
    pane.add(scrollPane,BorderLayout.WEST) ;
    pane.setVisible(true) ;
    validate() ;
    }其中MPWestPanel1,MPWestPanel2,MPWestPanel3都是JFrame
      

  4.   


    上图中左上方为点击btnMP1的界面,左下方为点击界面中事件响应后的效果(没问题)右上方为点击btnMP2的界面,也达到预期显示效果,但点击界面中事件响应会变回原响应,如右下方所示应该是没有把旧的组件remove,可怎么搞??我的部分源程序见楼上
      

  5.   

    btnMP1为Button1,  btnMP2为Button2
    至于Button3的效果一样,都是最先点击哪个键,事件响应就是那个键对应的界面事件响应
      

  6.   

    你尝试只new一个JScrollPane   然后 每次更换JScrollPane   里面的内容    记得要updateUI();
      

  7.   


                JScrollPane scrollPane = new JScrollPane();
    pane.add(scrollPane,BorderLayout.WEST) ; 
    if (ae.getSource() == btnMP1) 
        { 
    MPWestPanel1 test1 = new MPWestPanel1() ; 
    scrollPane.getViewport().setView(test1.getComponent());
    scrollPane.updateUI();
    validate() ; 

    if (ae.getSource() == btnMP2) 

    MPWestPanel2 test2 = new MPWestPanel2() ; 
    scrollPane.getViewport().setView(test2.getComponent());
    scrollPane.updateUI();
    validate() ; 

    if (ae.getSource() == btnMP3) 
    {
    MPWestPanel3 test3 = new MPWestPanel3() ; 
    scrollPane.getViewport().setView(test3.getComponent());
    scrollPane.updateUI();
    validate() ; 
    } 你試試這樣行不行~~   不行再想別的辦法~~
      

  8.   

    swing的疯狂热爱者,欢迎所有swing ,swt,JFace的爱好者
    在这里,有技术高手做支持
    群号:1010306为平衡群性别:女生优先进
      

  9.   

    还是没搞定啊!!惆怅
    知道怎样把BorderLayout里的WEST部分去掉吗??
    getLayoutComponent(Container target, Object constraints) 怎么用??整不出来啊!!
      

  10.   

    还是没搞定啊!!惆怅
    知道怎样把BorderLayout里的WEST部分去掉吗??
    getLayoutComponent(Container target, Object constraints) 怎么用??整不出来啊!!
      

  11.   

    主程序:import java.awt.* ;
    import java.awt.event.* ;
    import javax.swing.* ;public class MPPanel extends JFrame implements ActionListener, MouseListener
    {
    Font fnt = new Font("隶书", Font.PLAIN, 36) ;
    JButton btnBack, btnExit, btnMP1, btnMP2, btnMP3 ;
    JPanel pane,paneW ;
    JScrollPane scrollPane ;

    public MPPanel()
    {
    super() ; 
    setSize(1000,700) ;
    setLocation(240,100) ;
    setResizable(true) ;
    setVisible(true) ;

    pane = new JPanel(new BorderLayout(10,10)) ;
    add(pane) ;

    addNorthPane() ; //添加 BorderLayout 布局中 North 部分组件
    addSouthPane() ; //添加 BorderLayout 布局中 South 部分组件

    JPanel paneW = new JPanel() ;
    paneW.setPreferredSize(new Dimension(200,600)) ;
    pane.add(paneW, BorderLayout.WEST) ;

    pane.add( new Button() ,BorderLayout.CENTER) ;

    btnBack.addActionListener(this) ;
    btnExit.addActionListener(this) ;
    }
    private void addNorthPane()
    {
    ImageIcon btnIcon1 = new ImageIcon("image/leftnav-tech.gif") ;
    ImageIcon btnIcon2 = new ImageIcon("image/leftnav-press.gif") ;
    ImageIcon btnIcon3 = new ImageIcon("image/leftnav-mission.gif") ;

    JPanel pnl = new JPanel(new GridLayout(1,3,20,20)) ;
    btnMP1 = new JButton("button1",btnIcon1) ;
    buttonTouMing(btnMP1) ;
    pnl.add(btnMP1) ;
    btnMP2 = new JButton("button2",btnIcon2) ;
    buttonTouMing(btnMP2) ;
    pnl.add(btnMP2) ;
    btnMP3 = new JButton("button3",btnIcon3) ;
    buttonTouMing(btnMP3) ;
    pnl.add(btnMP3) ;

    JPanel paneN = new JPanel(new GridBagLayout()) ;
    GridBagConstraints gbc = new GridBagConstraints() ;
            gbc.gridwidth = GridBagConstraints.REMAINDER ; 
            JLabel label = new JLabel("练习界面",JLabel.CENTER) ;
    label.setFont(fnt) ;
            paneN.add(label,gbc) ;

    gbc.insets = new Insets(0, 20, 0, 10) ; 
            gbc.gridwidth = GridBagConstraints.REMAINDER ; 
            gbc.anchor = GridBagConstraints.WEST ;
            gbc.weightx = 1.0 ; 
    paneN.add(pnl,gbc) ;

    pane.add(paneN, BorderLayout.NORTH) ;

    btnMP1.addMouseListener(this) ;
    btnMP2.addMouseListener(this) ;
    btnMP3.addMouseListener(this) ;

    btnMP1.addActionListener(this) ;
    btnMP2.addActionListener(this) ;
    btnMP3.addActionListener(this) ;
    }
    private void addSouthPane()
    {
    btnBack = new JButton("返回") ;
    btnExit = new JButton("退出") ;

    JPanel paneM = new JPanel(new GridBagLayout()) ;
    JPanel pnl = new JPanel(new GridLayout(1,2,20,20)) ;
    pnl.add(btnBack) ;
    pnl.add(btnExit) ;

    GridBagConstraints gbc = new GridBagConstraints() ;
    gbc.insets = new Insets(0, 0, 10, 20) ; 
            gbc.gridwidth = GridBagConstraints.REMAINDER ; 
    gbc.anchor = GridBagConstraints.EAST ;
    gbc.weightx = 1.0 ; 
    paneM.add(pnl,gbc) ;

    pane.add( paneM ,BorderLayout.SOUTH) ;
    }
    private void buttonTouMing(JButton btn)    //按钮透明效果
        {
         btn.setOpaque(false) ; 
         btn.setContentAreaFilled(false) ;
         btn.setBorder(null) ; 
         btn.setIconTextGap(10) ;
        }

    public void mouseEntered(MouseEvent me)
    {
    if (me.getSource() == btnMP1)
    btnMP1.setForeground(Color.LIGHT_GRAY) ;

    if (me.getSource() == btnMP2)
    btnMP2.setForeground(Color.LIGHT_GRAY) ;

    if (me.getSource() == btnMP3)
    btnMP3.setForeground(Color.LIGHT_GRAY) ;
    }
    public void mouseExited(MouseEvent mt) 

    if (mt.getSource() == btnMP1)
    btnMP1.setForeground(Color.DARK_GRAY) ;

    if (mt.getSource() == btnMP2)
    btnMP2.setForeground(Color.DARK_GRAY) ;

    if (mt.getSource() == btnMP3)
    btnMP3.setForeground(Color.DARK_GRAY) ;
    }
    public void mouseClicked(MouseEvent e) { }
    public void mousePressed(MouseEvent e) { }
    public void mouseReleased(MouseEvent e) { }

    public void actionPerformed(ActionEvent ae)
    {
    /*if (ae.getSource() == btnBack)
        {
    dispose() ;
    JFrame mainmenu = new MainMenu(); 
             Container container = mainmenu.getContentPane() ;
             mainmenu.setContentPane(container) ;
             validate();
    }*/
    if (ae.getSource() == btnExit)
        {
    System.exit(0) ;
    }
    if (ae.getSource() == btnMP1)
        {
    MPWestPanel1 test = new MPWestPanel1() ;
    JScrollPane scrollPane = new JScrollPane(test.getComponent()) ;
    pane.add(scrollPane,BorderLayout.WEST) ;
    pane.setVisible(true) ;
    validate() ;
    }
    if (ae.getSource() == btnMP2)
        {
    MPWestPanel2 test = new MPWestPanel2() ;
    JScrollPane scrollPane = new JScrollPane(test.getComponent()) ;
    pane.add(scrollPane,BorderLayout.WEST) ;
    pane.setVisible(true) ;
    validate() ;
    }
    if (ae.getSource() == btnMP3)
        {
    MPWestPanel3 test = new MPWestPanel3() ;
    JScrollPane scrollPane = new JScrollPane(test.getComponent()) ;
    pane.add(scrollPane,BorderLayout.WEST) ;
    pane.setVisible(true) ;
    validate() ;
    } } public static void main( String[] args )
    {
    JFrame mainPanel = new MPPanel() ;
    mainPanel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
    mainPanel.getContentPane() ;
    mainPanel.setVisible(true) ;
    }
    }
      

  12.   

    MPWestPanel1、MPWestPanel2、MPWestPane3一样,就内容显示不同,只贴一个吧!// 界面 West1 部分菜单
    import java.awt.* ; 
    import java.awt.event.* ; 
    import java.awt.font.FontRenderContext ;
    import java.awt.font.LineMetrics ;
    import java.awt.image.BufferedImage ;
    import javax.swing.* ; public class MPWestPanel1 extends JFrame implements ActionListener, MouseListener
    {
        JButton[] btns ;
    JPanel[] panels ;
    MPActionPanel1[] aps ;  public MPWestPanel1() 
        {
    assembleActionPanels() ;
         assemblePanels() ;
        }
    public void mousePressed(MouseEvent e) 
        { 
         MPActionPanel1 ap = (MPActionPanel1) e.getSource() ; 
         if (ap.contains(e.getPoint())) 
         { 
         ap.toggleSelection() ; 
             togglePanelVisibility(ap) ; 
         } 
        }     private void togglePanelVisibility(MPActionPanel1 ap) 
        { 
         int index = getPanelIndex(ap) ; 
            if (panels[index].isShowing()) 
             panels[index].setVisible(false) ; 
            else 
                panels[index].setVisible(true) ; 
            ap.getParent().validate() ; 
        }     private int getPanelIndex(MPActionPanel1 ap) 
        { 
         for (int j = 0; j < aps.length; j++) 
         if (ap == aps[j]) 
         return j ; 
         return -1 ; 
        }     private void assembleActionPanels() 
        { 
         String[] ids = {"资料MP1", "合同处理MP1", "相关参数设定MP1", "帮助MP1" } ;
         aps = new MPActionPanel1[ids.length] ; 
         for (int j = 0; j < aps.length; j++) 
         aps[j] = new MPActionPanel1(ids[j], this) ; 
        } 
        private void assemblePanels() 
        {
         ImageIcon rss = new ImageIcon("image/testok.gif") ;
         ImageIcon wri = new ImageIcon("image/comments.gif") ;
         ImageIcon sds = new ImageIcon("image/MoreTopics.gif") ;
         ImageIcon swa = new ImageIcon("image/yahoo.gif") ;
        
         GridBagConstraints gbc = new GridBagConstraints() ; 
         gbc.anchor = GridBagConstraints.WEST ;
         gbc.gridwidth = GridBagConstraints.REMAINDER ; 
         gbc.insets = new Insets(3, 20, 3, 0) ; 
         gbc.weightx = 1.0 ; 
        
         JPanel p1 = new JPanel(new GridBagLayout()) ;
         JButton btn11 = new JButton("导入1",wri) ;
         buttonTouMing(btn11) ;
         p1.add(btn11,gbc) ;
         JButton btn12 = new JButton("导出1",wri) ;
         buttonTouMing(btn12) ;
         p1.add(btn12,gbc) ;
        
         JPanel p2 = new JPanel(new GridBagLayout()) ;
         JButton btn21 = new JButton("合同编制1",rss) ;
         buttonTouMing(btn21) ;
         p2.add(btn21,gbc) ;
         JButton btn22 = new JButton("预算编制1",rss) ;
         buttonTouMing(btn22) ;
         p2.add(btn22,gbc) ;
         JButton btn23 = new JButton("合同情况上报1",rss) ;
         buttonTouMing(btn23) ;
         p2.add(btn23,gbc) ;
         JButton btn24 = new JButton("合同验收1",rss) ;
         buttonTouMing(btn24) ;
         p2.add(btn24,gbc) ;
        
         JPanel p3 = new JPanel(new GridBagLayout()) ;
         JButton btn31 = new JButton("帐户管理1",sds) ;
         buttonTouMing(btn31) ;
         p3.add(btn31,gbc) ;
         JButton btn32 = new JButton("导航栏1",sds) ;
         buttonTouMing(btn32) ;
         p3.add(btn32,gbc) ;
         JButton btn33 = new JButton("参数设定1",sds) ;
         buttonTouMing(btn33) ;
         p3.add(btn33,gbc) ;
         JButton btn34 = new JButton("保密责任书1",sds) ;
         buttonTouMing(btn34) ;
         p3.add(btn34,gbc) ;
         JButton btn35 = new JButton("打印设置1",sds) ;
         buttonTouMing(btn35) ;
         p3.add(btn35,gbc) ;
        
         JPanel p4 = new JPanel(new GridBagLayout()) ;
         JButton btn41 = new JButton("帮助1",swa) ;
         buttonTouMing(btn41) ;
         p4.add(btn41,gbc) ;
         JButton btn42 = new JButton("关于本软件1",swa) ;
         buttonTouMing(btn42) ;
         p4.add(btn42,gbc) ;
         JButton btn43 = new JButton("最近的文档数据1",swa) ;
         buttonTouMing(btn43) ;
         p4.add(btn43,gbc) ;
        
         panels = new JPanel[] { p1, p2, p3, p4 } ; 
         btns = new JButton[] {btn11, btn12,btn21,btn22,btn23,btn24,btn31,btn32,btn33,btn34,btn35,btn41,btn42,btn43} ;
        
         for (int i = 0; i< btns.length; i++)
         {
         btns[i].addMouseListener(this) ;
         btns[i].addActionListener(this) ;
         }
        }    private void buttonTouMing(JButton btn)    //按钮透明效果
        {
         btn.setOpaque(false) ; 
         btn.setContentAreaFilled(false) ;
         btn.setBorder(null) ; 
         btn.setIconTextGap(8) ;
        }
        
        public JPanel getComponent()
        { 
         JPanel panel = new JPanel(new GridBagLayout()) ; 
         GridBagConstraints gbc = new GridBagConstraints() ; 
         gbc.insets = new Insets(1, 3, 0, 3) ; 
         gbc.weightx = 1.0 ; 
         gbc.fill = GridBagConstraints.HORIZONTAL ; 
         gbc.gridwidth = GridBagConstraints.REMAINDER ;      for (int j = 0; j < aps.length; j++) 
         {
         panel.add(aps[j],gbc) ; 
         panel.add(panels[j],gbc) ; 
             panels[j].setVisible(false) ; 
         } 
             
         JLabel padding = new JLabel() ; 
         gbc.weighty = 1.0 ; 
         panel.add(padding, gbc) ; 
         return panel ; 
        } 
        
        public void mouseEntered(MouseEvent me)
    {
         for (int i = 0; i< btns.length; i++)
         {
         if (me.getSource() == btns[i])
         btns[i].setForeground(Color.LIGHT_GRAY) ;
         }
    }
    public void mouseExited(MouseEvent mt) 

    for (int i = 0; i< btns.length; i++)
         {
         if (mt.getSource() == btns[i])
         btns[i].setForeground(Color.DARK_GRAY) ;
         }
    }
    public void mouseClicked(MouseEvent e) { }
    public void mouseReleased(MouseEvent e) { }

    public void actionPerformed(ActionEvent ae)
    {
    for (int i = 0; i< btns.length; i++)
         {
         if (ae.getSource() == btns[i])
         {
         btns[i].setForeground(Color.DARK_GRAY) ;
         String str = btns[i].getText() ;
         JOptionPane.showMessageDialog(null,"欢迎使用" + str + "功能") ;
         }
         }
    }

    public static void main(String[] args) 
        {
         MPWestPanel1 test = new MPWestPanel1() ; 
         JFrame f = new JFrame() ; 
         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;   //关闭窗口时退出程序
         f.getContentPane().add(new JScrollPane(test.getComponent())) ; 
         f.setSize(220, 600) ; 
         f.setVisible(true) ; 
        } 
    }

    class MPActionPanel1 extends JPanel 
    {
    String text ; 
    Font font ; 
    private boolean selected ; 
    BufferedImage open, closed ; 
    int WIDTH = 160, OFFSET = 25, ArrowX = 140, ArrowY = 8 ;  public MPActionPanel1(String text, MouseListener ml) 

    this.text = text ; 
    addMouseListener(ml) ; 
    font = new Font("宋体", Font.BOLD, 13) ; 
    selected = false ; 
    setBackground(new Color(200, 200, 220)) ; 
    setPreferredSize(new Dimension(WIDTH, 25)) ; 
    setBorder(BorderFactory.createRaisedBevelBorder()) ; //设置边界
    setPreferredSize(new Dimension(WIDTH, 25)) ;  
    setRequestFocusEnabled(true) ; 

    public void toggleSelection() 

    selected = !selected ; 
    repaint() ; 

    protected void paintComponent(Graphics g) 
    {
    super.paintComponent(g) ; 
    Graphics2D g2 = (Graphics2D) g ; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON) ; 
    int h = getHeight() ; 

    Image downarrow = new ImageIcon("image/downarrow.gif").getImage() ;
    Image uparrow = new ImageIcon("image/uparrow.gif").getImage() ;

    if (selected) 
        g2.drawImage(uparrow, ArrowX, ArrowY, this); 
    else 
        g2.drawImage(downarrow, ArrowX, ArrowY, this); 

    g2.setFont(font) ; 
    FontRenderContext frc = g2.getFontRenderContext() ; 
    LineMetrics lm = font.getLineMetrics(text, frc) ; 

    float height = lm.getAscent() + lm.getDescent() ; 
    float x = OFFSET ; 
    float y = (h + height) / 2 - lm.getDescent() ; 
    g2.drawString(text, x, y) ; 

    }
      

  13.   

    好累啊   改得差不多了  你再调调大小就应该ok了 ~~第一个  把你这句JPanel paneW = new JPanel() ; 
           改成这个了paneW = new JPanel();第二个  就是改你的点击button那的if判断 public void actionPerformed(ActionEvent ae) { JScrollPane scrollPane1 = new JScrollPane(new MPWestPanel1().getComponent());
    JScrollPane scrollPane2 = new JScrollPane(new MPWestPanel2().getComponent());
    JScrollPane scrollPane3 = new JScrollPane(new MPWestPanel3().getComponent());
    if (ae.getSource() == btnExit) {
    System.exit(0);
    }
    if (ae.getSource() == btnMP1) {
    paneW.removeAll();
    paneW.add(scrollPane1);
    validate();
    }
    if (ae.getSource() == btnMP2) {
    paneW.removeAll();
    paneW.add(scrollPane2);
    validate();
    }
    if (ae.getSource() == btnMP3) {
    paneW.removeAll();
    paneW.add(scrollPane3);
    validate();
    } }
    可能把这几个 JScrollPane   放到外面去new更好
      

  14.   

    可以了,谢谢啊
    还有一个问题,MPWestPanel里事件响应(比如按下某按钮后执行一个新的JFrame或JPanel),怎样让它显示在MPPanel的Center里??