참고 : 내 질문을 완전히 이해하려면 예제를 컴파일하고 실행해야 할 수도 있습니다. 이것이 유대인이 아니라면, 나는 사전에 사과한다.자바 팝업 버튼
JToggleButton
및 JPopupMenu
을 기반으로하는 스윙 컨트롤을 만들려고합니다.
팝업 메뉴가 표시되면 토글 버튼이 선택되고 팝업 메뉴가 표시되지 않으면 토글 버튼이 선택 취소됩니다. 따라서 팝업은 임의의 구성 요소를 포함 할 수 있다는 것을 제외하고는 동작이 JComboBox
과 유사합니다.
다음 코드는 컨트롤 (예 : JPopupToggleButton
과 같은 자체 클래스에있을 것입니다.)을 만드는 방법의 예입니다. 불행히도, 다른 모양과 느낌으로 다른 동작을 보입니다 (필자는 Metal과 Nimbus로 테스트했습니다).
여기에 게시 된 코드는 Nimbus가 아니라 Metal에서 예상대로 작동합니다. Nimbus를 사용할 때 토글 버튼을 반복적으로 클릭하여 팝업을 표시하거나 숨기면 무슨 뜻인지 알 수 있습니다.
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
public class PopupButtonExample extends JFrame
{
public static void main(String[] args)
{
java.awt.EventQueue.invokeLater(new Runnable()
{
@Override
public void run()
{
PopupButtonExample example = new PopupButtonExample();
example.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
example.setVisible(true);
}
});
}
public PopupButtonExample()
{
super("Components in Popup");
JPanel popupPanel = new JPanel();
popupPanel.setLayout(new BorderLayout());
popupPanel.add(new JLabel("This popup has components"),
BorderLayout.NORTH);
popupPanel.add(new JTextArea("Some text", 15, 20),
BorderLayout.CENTER);
popupPanel.add(new JSlider(), BorderLayout.SOUTH);
final JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(popupPanel);
final JToggleButton popupButton = new JToggleButton("Show Popup");
popupButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
if(popupButton.isSelected())
popupMenu.show(popupButton, 0, popupButton.getHeight());
}
});
popupMenu.addPopupMenuListener(new PopupMenuListener()
{
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent pme) {}
@Override
public void popupMenuCanceled(PopupMenuEvent pme) {}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent pme) {
Point mouseLoc = MouseInfo.getPointerInfo().getLocation();
Point componentLoc = popupButton.getLocationOnScreen();
mouseLoc.x -= componentLoc.x;
mouseLoc.y -= componentLoc.y;
if(!popupButton.contains(mouseLoc))
popupButton.setSelected(false);
}
});
JPanel toolBarPanel = new JPanel();
toolBarPanel.add(popupButton);
JToolBar toolBar = new JToolBar();
toolBar.add(toolBarPanel);
setLayout(new BorderLayout());
add(toolBar, BorderLayout.PAGE_START);
setPreferredSize(new Dimension(640, 480));
pack();
}
}
다음 줄을 출력하면 Nimbus에서는 코드가 예상대로 작동하지만 Metal에서는 예상대로 작동하지 않습니다. 다시 말하지만 토글 버튼을 계속 클릭하여 내 뜻을 확인하십시오. 그래서 여기
// Point mouseLoc = MouseInfo.getPointerInfo().getLocation();
// Point componentLoc = popupButton.getLocationOnScreen();
// mouseLoc.x -= componentLoc.x;
// mouseLoc.y -= componentLoc.y;
// if(!popupButton.contains(mouseLoc))
내 두 가지 질문은 다음과 같습니다
(1) 후광에서, 이유는 무엇입니까는 금속과 마찬가지로, 토글 버튼에 전달되지 팝업 패널을 숨 깁니다 클릭?
(2) 모든 모양과 느낌에서 작동하도록이 문제를 해결하려면 어떻게해야합니까?
일을 좋은 상담자 JWindow의에 대한 – mKorbel