JMenu 에서 JMenuItem을 삭제한 후 화면갱신이 안되는문제
소
문제증상은 그림과 같습니다.
소스코드를 어떻게 수정하면 문제를 해결할수 있을까요??
고수님들의 답변 부탁드립니다...ㅜimport java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
class MenuPopup_test extends JFrame implements MouseListener
{
JMenu file = new JMenu(파일);
JMenuItem test1 = new JMenuItem(속성1); // 제거될 가능성이 있는 컴포넌트
JMenuItem test2 = new JMenuItem(속성2); // 제거될 가능성이 있는 컴포넌트
JPopupMenu pop = new JPopupMenu();
JMenuItem del = new JMenuItem(삭제);
JMenuItem temp;
public MenuPopup_test(){
this.setVisible(true);
this.setSize(500,300);
// 메뉴설정
JMenuBar jmb = new JMenuBar();
this.setJMenuBar(jmb);
jmb.add(file);
file.add(test1);
file.add(test2);
//팝업설정
pop.add(del);
test1.addMouseListener(this);
test2.addMouseListener(this);
del.addMouseListener(this);
}
public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e){
if(e.getSource()==del){
file.remove(temp);
file.updateUI();
//file.fireMenuSelected();
}
}
public void mouseReleased(MouseEvent e){
if(e.getSource()==test1 || e.getSource()==test2){
if(e.isPopupTrigger()){
file.setPopupMenuVisible(true);
pop.show((Component)e.getSource(), e.getX(), e.getY());
temp=(JMenuItem) e.getComponent();
}
}
}
public static void main(String[] args) {
new MenuPopup_test();
}
}
-
모은 2025-02-26
음..... 그런가요.. 며칠 잡아먹고있던건데 불가능한걸 가지고 삽질을 하고있었다니 _-;;; 다른방법으로 구현을 생각해봐야겠네요 애고....ㅠㅠ
답변 감사드려요.. -
참 2025-02-26
원래 메뉴라는게 아이템을 삭제하고 넣는 그런걸 하는 목적으로 만든게 아닌데요... 걍 disable 해서 이벤트를 못 먹게 하는게 보통이죠. 꼭 컴포넌트를 삭제해야한다면 그 컴포넌트가 있어야 할 곳은 메뉴가 아니라고 봐야 합니다.
-
종달 2025-02-26
네.. 저는 걍 제가 생각하는 UI 처리에 대한 생각으로는....
메뉴아이템이 사라지는것은 그리 좋은 생각이 아니라고 보입니다.
( 물론 간단한 테스트 등에서 사용해 보는것은 문제가 아니겠지만. )
메뉴아이템이 사라지면 매번 클릭하던 위치에 해당 메뉴 아이템이가 빠지게 되므로,
그 아래에 있는 메뉴아이템들이 위로 올라오게 됩니다.
그래서 메뉴아이템이 원래 있던곳 보다 위로 올라가게 되지요..
그래서 제 생각에는 메뉴아이템을 없애는것 보다는 disa -
벤자민 2025-02-26
제가 아는 범위에서 말씀드리면, swing에서 컨테이너내 컴포넌트를 동적으로 삭제할 경우, 다음과정이 필요합니다. 여기서, container는 삭제할 대상을 포함하고 있는 parent component 입니다.
정확한 답변은 아니니 참고만 하세요. (암튼, invalidate는 반드시 들어가야 할거에요)
container.invalidate();
container.validate();
container.repaint();