我写了一个主程序MPPanel,MPWestPanel为其BorderLayout里的WEST部分。
现在我想点击MPWestPanel里事件响应(比如按下某按钮后执行一个新的JFrame或JPanel),怎样让它显示在MPPanel的Center里??
代码如下: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 ;

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 部分组件

paneW = new JPanel() ;
MPWestPanel1 test = new MPWestPanel1() ;
JScrollPane scrollPane = new JScrollPane(test.getComponent()) ;
scrollPane.setPreferredSize(new Dimension(175,540)) ;
paneW.add(scrollPane) ;
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) ;
    }
private void setWestPanelSize(JScrollPane scrollPane)
{
scrollPane.setPreferredSize(new Dimension(175,540)) ;
scrollPane.setBorder(BorderFactory.createEtchedBorder()) ;
}

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)
    {
paneW.removeAll() ;
MPWestPanel1 test1 = new MPWestPanel1() ;
JScrollPane scrollPane1 = new JScrollPane(test1.getComponent()) ;
setWestPanelSize(scrollPane1) ;
paneW.add(scrollPane1,BorderLayout.WEST) ;
validate() ;
}
if (ae.getSource() == btnMP2)
    {
paneW.removeAll() ;
MPWestPanel2 test2 = new MPWestPanel2() ;
JScrollPane scrollPane2 = new JScrollPane(test2.getComponent()) ;
setWestPanelSize(scrollPane2) ;
paneW.add(scrollPane2,BorderLayout.WEST) ;
validate() ;
}
if (ae.getSource() == btnMP3)
    {
paneW.removeAll() ;
MPWestPanel3 test3 = new MPWestPanel3() ;
JScrollPane scrollPane3 = new JScrollPane(test3.getComponent()) ;
setWestPanelSize(scrollPane3) ;
paneW.add(scrollPane3,BorderLayout.WEST) ;
validate() ;
} } public static void main( String[] args )
{
JFrame mainPanel = new MPPanel() ;
mainPanel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
mainPanel.getContentPane() ;
mainPanel.setVisible(true) ;
}
}

解决方案 »

  1.   

    MPWestPanel程序如下:
    (MPWestPanel1、MPWestPanel2、MPWestPane3相同,仅文字显示内容不同,仅列一个)
    事件响应不为程序中所写,我希望可调用另一个JFrame或JPanel// 界面 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) ; 

    }
      

  2.   

    那个问题解决了  呵呵
    现在想点击MPWestPanel的按钮来激活事件,使其显示在MPPanel的CENTER事件响应没搞定 
      

  3.   

    怎么没人回帖啊????
    我这几天自己写了部分代码,可有问题:可以在CENTER部分显示了,但似乎会报错(我用eclipse编译运行),但不影响运行。
    可郁闷的是总会新建一个MPPanel,显示内容也在新的MPPanel里;不能在原来的里面显示吗??事件响应部分代码如下,各位大侠帮看看啊!!
    public void actionPerformed(ActionEvent ae) 

       MPPanel mppanel = new MPPanel();
       //  练习时为区别起见,第奇数个按钮的事件响应与第偶数个按钮事件响应不同
       for (int i = 0; i < btns.length; i=i+2)
       { 
          if (ae.getSource() == btns[i]) 
          { 
              btns[i].setForeground(Color.DARK_GRAY) ; 
              String str = btns[i].getText() ; 
              mppanel.paneC.removeAll() ;
              CenterPanel cp = new CenterPanel() ;   //  调用JFrame程序CenterPanel
              cp.setVisible(false) ;
              mppanel.paneC.add(new JLabel("欢迎使用" + str + "功能",JLanel.CENTER) ;
              JScrollPane scroll = new JScrollPane(cp.getContentPane());   
              mppanel.paneC.add(scroll) ;
              validate() ;
          } 
       } 
       for (int i = 1; i < btns.length; i=i+2) 
       { 
          if (ae.getSource() == btns[i]) 
          { 
              btns[i].setForeground(Color.DARK_GRAY) ; 
              String str = btns[i].getText() ; 
              mppanel.paneC.removeAll() ;
              CenterPanelCopy cpCopy = new CenterPanelCopy() ;   //  调用JFrame程序CenterPanelCopy
              cp.setVisible(false) ;
              mppanel.paneC.add(new JLabel("欢迎使用" + str + "功能",JLanel.CENTER) ;
              JScrollPane scroll = new JScrollPane(cpCopy.getContentPane());   
              mppanel.paneC.add(scroll) ;
              validate() ;
          } 
       } } 
      

  4.   

    1.在MPWestPanel1中增加声明:private MPPanel mpPanel;
    并且在构造函数中初始化mpPanel,这样在事件处理的过程中就可以直接操纵MPPanel了
    2.eclipse报错的原因在19行,转型错误
    if (e.getSource().getClass().equals(MPActionPanel1.class)) {
    }
    把你写的逻辑放到if中就没有错误了
      

  5.   

    MPWestPanel1中增加 public MPWestPanel1(MPPanel mainPanel) throws HeadlessException {
    super();
    this.mainPanel = mainPanel;
    }MPPanel中26行改为PWestPanel1 test = new MPWestPanel1(this);
      

  6.   

    还是不行啊!!
    用我后来贴的事件响应,最后运行效果还是会新建一个MPPanel啊????
    好惆怅
      

  7.   

    后来新贴得事件响应中,不要新new MPPanel
    public void actionPerformed(ActionEvent ae) {
      for (int i = 0; i < btns.length; i=i+2)
      {
          if (ae.getSource() == btns[i])
          {
              btns[i].setForeground(Color.DARK_GRAY) ;
              String str = btns[i].getText() ;
              mainPanel.paneC.removeAll();
              mainPanel.paneC.add(new JLabel("welcome to use" + str + "funcational"));
              mainPanel.validate() ;
          }
      }
      for (int i = 1; i < btns.length; i=i+2)
      {
          if (ae.getSource() == btns[i])
          {
              btns[i].setForeground(Color.DARK_GRAY) ;
              String str = btns[i].getText() ;
              mainPanel.paneC.removeAll() ;
              mainPanel.paneC.add(new JLabel("welcome to use" + str + "funcational"));
              mainPanel.validate();
          }
      } 
    }
      

  8.   

    MPWestPanel1中:        private MPPanel mainPanel;
    public MPWestPanel1(MPPanel mainPanel) throws HeadlessException {
    super();
    this.mainPanel = mainPanel;
    assembleActionPanels();
    assemblePanels();
    }MPPanel中:
    MPWestPanel1 test = new MPWestPanel1(this);
      

  9.   

    搞定了  谢谢
    我先前在事件响应里写的是 validate() 而不是 mainPanel.validate(); 
    这几天麻烦你了  Thank you !