감사합니다, I 해결책을 찾았습니다. 어쨌든 내 SSCCE는 다른 사람에게 유용 할 수 있습니다. 누가 알아? 어떻게 작동하는지 보려면 복사하고 실행하십시오.
는 (참고 : 보조 질문의 난이 후 포즈하려는 때문에 코드가 정말로 짧은되지 않습니다) : 지금이 내가 그것 (수행 할 작업을한다는 것을 예를 활성화하고
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
public class CustomPopup extends JPopupMenu
{
private JMenuItem menuItem1 = new JMenuItem("One");
private JMenuItem menuItem2 = new JMenuItem("Two");
private JMenuItem menuItem3 = new JMenuItem("Three");
private JMenuItem menuItem4 = new JMenuItem("Four");
private JMenuItem menuItem5 = new JMenuItem("Five");
public CustomPopup()
{
this.add(menuItem1);
this.add(menuItem2);
this.add(menuItem3);
this.add(menuItem4);
this.add(menuItem5);
addListeners(this);
}
private void addListeners(final JPopupMenu popup /*, final String someLetter*/)
{
popup.addPopupMenuListener(new PopupMenuListener(){
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent evt)
{
JMenuItem menuItem = (JMenuItem)popup.getComponent(3);
String[] letters = {"A", "B", "C", "D"};
ArrayList<String> lettersList = new ArrayList<String>();
lettersList.addAll(Arrays.asList(letters));
String someLetter = getRandomAlphabet();
if(lettersList.contains(someLetter)){
menuItem.setEnabled(true);
}
else{
menuItem.setEnabled(false);
}
}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent evt){
// No Override
}
@Override
public void popupMenuCanceled(PopupMenuEvent evt){
// No Override
}
});
}
private String getRandomAlphabet()
{
String alpha = "";
String Alphas[] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"};
double bigNum = Math.random() * 1000000;
String str = String.valueOf(bigNum);
int idx = Integer.valueOf(String.valueOf(str.charAt(str.length() - 1)));
if(idx < 6)
{
alpha = Alphas[idx];
}
else
{
alpha = Alphas[idx - 5];
}
return alpha;
}
public static void main(String[] args)
{
/*try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
JPanel panel = new JPanel();
JPopupMenu popupMenu = new CustomPopup();
panel.setComponentPopupMenu(popupMenu);
panel.setLayout(new GridBagLayout());
/*JButton button = new JButton("Action");
button.setSize(new Dimension(60, 20));
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(null, "Button was clicked");
}
});
panel.add(button);*/
JFrame frame = new JFrame("popupTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(200, 200));
frame.add(panel);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
질문 지정된 계산 getRandomAlphabet()
의 무작위 결과를 바탕으로 menuItem4
을 동적으로 비활성화하십시오. @Guillaume Polet의 Lovely 구현을 살펴본 후 테스트했습니다. 아주 좋아 ... 그래서 방금 버튼을 추가하기로 결정했고 기본 자바 기본이 아닌 UIManager
을 사용할 때 팝업을 가지고 있었던 가장 성가신 문제 중 하나를 테스트했습니다. 똑같은 일이 발생합니다!
의미는 무엇입니까? LnF가 기본값 Metal
이 아닌 경우 popupMenu가 표시된 후에 다른 Actionable 구성 요소에서 popupMenu 외부를 클릭하면 첫 번째 클릭에서 작동하지 않습니다 (팝업 만 보이게 설정 됨). 그런 다음 해당 액션이 해고되기 전에 구성 요소를 다시 클릭해야합니다 (두 번째) ... 매우 성가신 일이 아닙니까?
이 시나리오의 느낌을 얻으려면 위의 코드 UIManager
섹션의 주석 처리를 제거하고 (@Guillaume Polet의 아름다운 솔루션에서 가져온 것) 또한 추가 한 Button
섹션의 주석 처리를 제거한 다음 프로그램을 실행하고 popupMenu
이 표시된 직후 버튼을 클릭하십시오. 재미있는 점은 자바의 기본 메탈 LnF를 사용할 때이 문제가 발생하지 않는다는 것입니다.
Windows 7의 시스템 기본 룩앤필을 사용하여이 문제를 해결했지만 잠자는 개가 거짓말을하기로 결정했습니다.하지만 솔직히 저는 이 문제를 해결할 수있는 방법이 있다고 생각합니다.이 문제를 해결할 수있는 사람이 있어야한다는 것을 알고 있습니다. 코드 블록, 길 찾기, 링크, 기타,이 문제를 해결할 수있는 곳이면 내 기쁨이 될 것입니다. 좋은 사람들에게 감사드립니다!
제발 더 나은 도움을 위해 [SSCCE] (http://sscce.org/), 짧은 실행 파일, 컴파일 가능한,'JFrame'에'JPopup'이 추가되었고'lettersList' 만 포함되었습니다 – mKorbel
'lettersList'는'letters' 배열에서 생성 된 String ArrayList입니다 (코드 라인 7 참조).'letter' 인자가 배열의 원소 중 하나인지' 편지'. 방금 단계 반복으로 단계를 수행하고 싶지 않았습니다. – CodeBurner
나는 길을 잃었습니다. 어쩌면 1K 개의 변형이있을 수 있습니다.이 스레드에서 SSCCE가 없으면 간단합니다. – mKorbel