これは(?)あなたにいくつかのアイデアを与えるかもしれません。
JLayerクラスを使用してJListを装飾し、閉じるアイコン(この例では単純な「X」文字)をペイントします。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.LayerUI;
import javax.swing.plaf.basic.*;
class LayerList extends JPanel
{
LayerList()
{
LayerUI<JComponent> layerUI = new LayerUI<JComponent>()
{
public void paint(Graphics g, JComponent c)
{
super.paint(g, c);
JLayer layer = (JLayer)c;
JList list = (JList)layer.getView();
int selected = list.getSelectedIndex();
if (selected == -1) return;
Rectangle area = list.getCellBounds(selected, selected);
g.drawString("X", area.width - 15, area.y + area.height - 3);
}
public void installUI(JComponent c)
{
super.installUI(c);
JLayer jlayer = (JLayer)c;
jlayer.setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
}
public void uninstallUI(JComponent c)
{
super.uninstallUI(c);
// reset the layer event mask
((JLayer) c).setLayerEventMask(0);
}
@Override
protected void processMouseEvent(MouseEvent e, JLayer l)
{
// e.consume();
if (e.getID() == MouseEvent.MOUSE_RELEASED)
{
JList list = (JList)e.getComponent();
int selected = list.getSelectedIndex();
Rectangle area = list.getCellBounds(selected, selected);
if (e.getX() >= area.width - 15)
{
e.consume();
DefaultComboBoxModel model = (DefaultComboBoxModel)list.getModel();
model.removeElementAt(selected);
list.setSelectedIndex(selected);
}
}
}
};
String[] data = { "a", "b", "c", "d", "e", "f" };
JComboBox<String> comboBox = new JComboBox<String>(data);
Object child = comboBox.getAccessibleContext().getAccessibleChild(0);
BasicComboPopup popup = (BasicComboPopup)child;
JList list = (JList)popup.getList();
Container c = SwingUtilities.getAncestorOfClass(JScrollPane.class, list);
JScrollPane scrollPane = (JScrollPane)c;
scrollPane.setViewportView(new JLayer<JComponent>(list, layerUI));
setLayout(new BorderLayout());
add(comboBox);
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("Layer List");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new LayerList());
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args)
{
EventQueue.invokeLater(() -> createAndShowGUI());
/*
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
*/
}
}
より多くの情報とJLayerクラスの使用例についてはHow to Decorate Components with the JLayer Class上のSwingのチュートリアルからのセクションをお読みください。
ポップアップは、コンボボックスのUIを介して表示される別のウィンドウであり、元のコンボボックスコンポーネントに直接接続するものではありません。また、実装の詳細は、使用するルックアンドフィールによって異なる場合があります。心のこもったアドバイスとして、別の解決策を見つけてください。このアドバイスを受けていない場合は、独自のルックアンドフィールコンポーネントのプログラミングに関する基本を読んで、BasicComboBoxUIを参考にしてください。 – mtj
@mtj独自の外観と感じはオプションではない、それはシステムのルック・アンド・フィールを使用し、それが私が推測し続けるはずのものである商用アプリケーションです。とにかくこれだけのために独自のルックアンドフィールを作成することは関数の価値がない – ScriptKiddy
JTable(不要な列数を持つ)を持つComboBoxEditorがあり、簡単で可能で、AbstractButtonを使用してXxxTableModelにBooloean値を格納することができます。おそらく直接装飾されていないJToggleButton 1つの問題があります。JButtonsコンポーネントを使用せずにJCコンポーネントとアイコンを保存することはできません。そうでない場合は、大変な努力が必要です。 – mKorbel