2016-08-23 7 views
1

JComboBoxを編集して、各セルに「削除」ボタン(画像/アイコン)を表示して特定のエントリを削除しようとしています。 私は既にカスタムCellRendererを作成しようとしましたが、画像を追加することはできましたが、MouseClicksに反応することはできませんでした(少なくとも画像/セルがクリックされたかどうかわかりません)。しかし、私はイメージの位置を知らない。JComboBox(JList) - 各セルのクリック可能な画像

enter image description here

誰もがこれを行う方法のアイデアを持っているならば、私はそれを感謝し、私はすでにgoogleingしようとしたが、私はまともな何かを見つけることができませんでした。

+0

ポップアップは、コンボボックスのUIを介して表示される別のウィンドウであり、元のコンボボックスコンポーネントに直接接続するものではありません。また、実装の詳細は、使用するルックアンドフィールによって異なる場合があります。心のこもったアドバイスとして、別の解決策を見つけてください。このアドバイスを受けていない場合は、独自のルックアンドフィールコンポーネントのプログラミングに関する基本を読んで、BasicComboBoxUIを参考にしてください。 – mtj

+0

@mtj独自の外観と感じはオプションではない、それはシステムのルック・アンド・フィールを使用し、それが私が推測し続けるはずのものである商用アプリケーションです。とにかくこれだけのために独自のルックアンドフィールを作成することは関数の価値がない – ScriptKiddy

+0

JTable(不要な列数を持つ)を持つComboBoxEditorがあり、簡単で可能で、AbstractButtonを使用してXxxTableModelにBooloean値を格納することができます。おそらく直接装飾されていないJToggleButton 1つの問題があります。JButtonsコンポーネントを使用せずにJCコンポーネントとアイコンを保存することはできません。そうでない場合は、大変な努力が必要です。 – mKorbel

答えて

3

これは(?)あなたにいくつかのアイデアを与えるかもしれません。

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のチュートリアルからのセクションをお読みください。

+0

これは非常に有望で、明日テストするつもりです、ありがとうございます。 – ScriptKiddy

0

パネルを使用してUIを構築します。ラベルとボタンを含むパネルを作成します(背景として画像を追加することができます)。このパネルをコンボボックスに項目として追加します。

http://www.codejava.net/java-se/swing/create-custom-gui-for-jcombobox

+0

既にそれについて考えていましたが、私はそれが私の最後の手段になる汚れた道だと思います。 – ScriptKiddy

関連する問題