java panel 所有事件_java-侦听/处理JPanel事件

先生们女士们晚上好,

我有一个Java Swing无法解决的问题,也许您可​​以帮助我.这里是:

>我有一个使用BorderLayout的JFrame和许多JPanels.

>每当我需要建立一个新屏幕时(例如,从主菜单中,单击“搜索”按钮时,转到“搜索”菜单),我只需删除位于中间的组件(JPanel),然后将新的屏幕(新的JPanel)放在中间.

>这样,我不需要每次都想放一个新屏幕时都调用所有的页眉和页脚对象.

除了这个小问题,一切都可以在该系统上正常运行:我想每次安装新的JPanel或改回现有的JPanel时都触发一些方法(通常来说,每次出现JPanel时).

为了做到这一点,我尝试实现ComponentListener的componentShown(ComponentEvent e)方法,并将一个ComponentListener添加到我放置在JFrame中心的JPanel中,但它不起作用.之后,我进行了一些研究,发现只有在更改JPanel的可见性(从不可见到可见或相反)时,componentShown(@ComponentListener)方法才起作用.不幸的是,我没有更改JPanel的可见性,只是用另一个JPanel代替了它:删除当前的JPanel,然后添加新的JPanel.下面的代码说明了如何替换JPanels.

// Get the JPanel located in the center of our JFrame

JPanel currentView = (JPanel) myFrame.getContentPane().getComponent( 2 );

if ( currentView != null )

{

// Remove it from the JPanel

myFrame.getContentPane().remove( currentView );

}

// Add the new JPanel

myFrame.getContentPane().add( otherView, BorderLayout.CENTER );

// Pack the JFrame and show it

myFrame.pack();

这就是我所拥有的.如果您能帮助我,我将不胜感激.

解决方法:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class ContainerListener extends JFrame {

private static final long serialVersionUID = 1L;

public ContainerListener() {

super("Test");

setContentPane(new TestPanel());

setDefaultCloseOperation(DISPOSE_ON_CLOSE);

pack();

setLocationRelativeTo(null);

setVisible(true);

}

public static void main(String[] parameters) {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

ContainerListener containerListener = new ContainerListener();

}

});

}

private class TestPanel extends JPanel {

private static final long serialVersionUID = 1L;

TestPanel() {

setLayout(new FlowLayout(FlowLayout.LEFT));

add(new JButton(new AbstractAction("Add label") {

private static final long serialVersionUID = 1L;

private int n = 0;

@Override

public void actionPerformed(ActionEvent event) {

TestPanel.this.add(new JLabel("Label " + ++n));

validate();

}

}));

addHierarchyListener(new HierarchyListener() {

@Override

public void hierarchyChanged(HierarchyEvent e) {

System.out.println("Components Change: " + e.getChanged());

if ((e.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) != 0) {

if (e.getComponent().isDisplayable()) {

System.out.println("Components: " + e.getChanged());

} else {

System.out.println("Components: " + e.getChanged());

}

}

}

});

addContainerListener(new ContainerAdapter() {

@Override

public void componentAdded(ContainerEvent event) {

System.out.println("componentAdded : " + event.getChild() + "containerName" + " was added");

}

});

}

@Override

public Dimension getPreferredSize() {

return new Dimension(400, 400);

}

}

}

标签:event-listener,event-handling,swing,jpanel,java

来源: https://codeday.me/bug/20191101/1983933.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值