JToggleButton
が押されたときにJDialog
(JList
を含む)を表示するJToggleButton
を構築しようとしています。 JToggleButton
が再び押されたとき、またはユーザーがフレーム内の他の場所をクリックすると、JDialog
が消えます(フォーカスが失われたときに私はFocusListener
JList
でこれをシミュレートしました)。JDialogとJToggleButtonの状態とイベントシーケンスを処理する
ボタンを順番に押すと、JDialog
が正しく表示され、非表示になります。
しかし、JDialog
が表示され、フレーム上の別の場所をクリックすると、フォーカスが失われたときにJDialog
が正しく表示されなくなるという問題があります。ただし、JToggleButton
の状態は誤って選択されたままになります。これは、今すぐJToggleButton
の状態が同期していないので、JToggleButton
をクリックするとJDialog
が表示されないことを意味します。代わりにJToggleButton
を2回押してJDialog
を再び表示させる必要があります。以下のコード例は、この問題を示しています。
の状態で、JList
の同期が失われているとは思えません。それは簡単な問題のようですが、解決策を見つけようとしています。誰も助けることができますか?ありがとう。
は、以下の私のコードを参照してください:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
public class MultiComboBox extends JToggleButton
{
public MultiComboBox(JFrame frame, String buttonText)
{
super(buttonText);
JDialog dialog = new JDialog(frame, false);
dialog.setLayout(new BorderLayout());
Object[] items = new Object[] { "one", "two", "three" };
JList list = new JList(items);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane listScrollPane = new JScrollPane(list,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
listScrollPane.setPreferredSize(list.getPreferredSize());
dialog.add(listScrollPane, BorderLayout.CENTER);
dialog.pack();
addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
final JToggleButton button = (JToggleButton) e.getSource();
System.out.println("button clicked: " + button.isSelected());
if (button.isSelected())
{
Point p = button.getLocation();
p.setLocation(p.getX() + 300, p.getY());
SwingUtilities.convertPointToScreen(p, button);
dialog.setLocation(p);
dialog.setVisible(true);
}
else
dialog.setVisible(false);
}
});
list.addFocusListener(new FocusListener()
{
@Override
public void focusGained(FocusEvent e)
{
}
@Override
public void focusLost(FocusEvent e)
{
System.out.println("list focusLost, dialog: " + dialog.isVisible());
dialog.setVisible(false);
}
});
}
public static void main(String[] args)
{
JFrame frame = new JFrame("Test");
frame.setPreferredSize(new Dimension(300, 300));
frame.setLayout(new BorderLayout());
MultiComboBox mcb = new MultiComboBox(frame, "Toggle");
JPanel buttonPanel = new JPanel(new BorderLayout());
buttonPanel.setPreferredSize(new Dimension(80, 30));
buttonPanel.add(mcb, BorderLayout.CENTER);
JPanel blankPanel = new JPanel(new BorderLayout());
frame.add(blankPanel, BorderLayout.CENTER);
frame.add(buttonPanel, BorderLayout.PAGE_START);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
提案をお寄せいただきありがとうございますが、残念ながらこれはまだ問題です。サンプルコードを使用すると、フォーカスが失われると 'JDialog'が消えますが、' JToggleButton'をクリックすると 'JDialog'が常に表示されるようになりました。以前の動作ではなく、 'JDialog'が現れ、' JToggleButton'が選択/選択解除されるたびに消えます。 – malaccan