下面是一個完整的編譯運行失敗的例子,說明了我的問題。JMenuItem擴展了JComponent。當添加到JPopupMenu并在背景關系選單中顯示時......它是......好吧。SHOWN,但是componentShown方法沒有呼叫。我怎樣才能知道JMenuItem何時被顯示呢?我需要從JMenuItem本身中知道。我正在創建這個JMenuItem并把它交給一個更大的框架。我對JPopupMenu、容器或任何其他組件一無所知,也無法控制。當我的JMenuItem被顯示時,我必須根據應用程式的背景關系和當前狀態更新其文本。我如何知道它何時被顯示呢?
在下面的例子中,在任何情況下都不會列印 "顯示的組件 "這一文本。右鍵單擊 JPanel 內部以獲得背景關系選單,您將看到 JMenuItem 文本 "Reply Hi",但現在輸出到控制臺。
我運行在 macOS 11.5.2 Big Sur 和 JDK 11.0.6 LTS(來自 Oracle)。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class JMenuItemListeners {
public static void main(String[] args){
JFrame frame = new JFrame() 。
JPanel panel = new JPanel() 。
frame.setMinimumSize(new Dimension(800, 600) 。)
panel.setLayout(new BorderLayout()) 。
panel.add(new JLabel("Hello World...right click me."/span>)。
BorderLayout.CENTER)。)
//========================================
JPopupMenu popupMenu = new JPopupMenu() 。
JMenuItem menuItem = new JMenuItem("Reply Hi") 。
menuItem.addComponentListener(
new ComponentListener() {
@Override
public void componentResized(ComponentEvent e) {}。
@Override
public void componentMoved(ComponentEvent e) {}。
@Override
public void componentShown(ComponentEvent e) {
System.out.println("組件顯示")。
}
@Override; }
public void componentHidden(ComponentEvent e) {} }
}
);
popupMenu.add(menuItem)。
panel.setComponentPopupMenu(popupMenu)。
//========================================
frame.setContentPane(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)。
frame.pack();
frame.setVisible(true)。
}
uj5u.com熱心網友回復:
你可以使用一個AncestorListener:
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class JMenuItemListeners {
public static void main(String[] args){
JFrame frame = new JFrame() 。
JPanel panel = new JPanel() 。
frame.setMinimumSize(new Dimension(800, 600) 。)
panel.setLayout(new BorderLayout()) 。
panel.add(new JLabel("Hello World...right click me."/span>)。
BorderLayout.CENTER)。)
//========================================
JPopupMenu popupMenu = new JPopupMenu() 。
JMenuItem menuItem = new JMenuItem("Reply Hi") 。
menuItem.addAncestorListener(new AncestorListener()
{
@Override
public void ancestorRemoved(AncestorEvent e) {}。
@Override
public void ancestorMoved(AncestorEvent e) {}。
@Override
public void ancestorAdded(AncestorEvent e) {
System.out.println("祖先顯示")。
}
});
popupMenu.add(menuItem)。
panel.setComponentPopupMenu(popupMenu)。
//========================================
frame.setContentPane(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)。
frame.pack();
frame.setVisible(true)。
}
uj5u.com熱心網友回復:
我不認為你會找到某種當JMenuItem顯示時被通知的監聽器。
我將嘗試將JMenuItem與您的應用程式的狀態解耦,我將使用javax.swing.AbstractAction來實作這一點。
您可以在您的應用程式的背景關系和/或狀態發生變化時更新AbstractAction,并且當JMenuItem被顯示時,它將反映您應用程式的背景關系和狀態。
下面的代碼片段包含了替換JPopupMenu和JMenuItem的創建。第二部分顯示了你將如何通過把JMenuItem變成一個時鐘來更新AbstractAction。
//========================================
JPopupMenu popupMenu = new JPopupMenu() 。
AbstractAction a = new AbstractAction("Reply Hi"/span>) {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Hi"/span>)。
}
};
JMenuItem menuItem = new JMenuItem(a)。
popupMenu.add(menuItem)。
panel.setComponentPopupMenu(popupMenu)。
//========================================
Timer t = new Timer(100, (e) -> {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("其'HH:mm:ss")。
a.putValue(Action.NAME, dtf.format(LocalTime.now()) )。
});
t.start()。
//========================================
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/310261.html
標籤:
上一篇:使用pandas合并兩列
