注:私の質問を完全に理解するために私の例をコンパイルして実行する必要があります。これが正直でない場合は、事前にお詫び申し上げます。Javaポップアップボタン
JToggleButton
とJPopupMenu
に基づいたSwingコントロールを作成しようとしています。
ポップアップメニューが表示されている場合はトグルボタンが選択され、ポップアップメニューが表示されていない場合はトグルボタンは選択解除されます。したがって、その動作は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)すべてのルックアンドフィールで動作するようにこの問題を解決するにはどうすればよいですか?私はあなたがすべての標準L & Fが自身の特定の問題を持っている金属
と比較してJToggleButtonに3つのマウスクリックを必要としていることがわかりニンバスはあまりにバギー(開発が途中でどこかで終了)され
1 JWindowのための素晴らしい質問 – mKorbel