2016-11-08 1 views
3

위/아래 화살표를 사용하여 스크롤하는 동안 Enter 키를 눌렀을 때만 내 콤보 상자 위쪽 타일을 업데이트하려고합니다.JComboBox에서 위쪽/아래쪽 화살표를 사용하여 스크롤하는 동안 선택된 항목을 표시하는 위쪽 타일을 업데이트하지 말아야합니다.

현재 위쪽/아래쪽 화살표를 사용하여 스크롤 할 때 현재 강조 표시된 현재 항목이 선택된 항목의 상단 타일 JComboBox에서 업데이트 중입니다. 나는 이것을 피할 필요가있다.

여기 내 코드입니다. 미리 감사드립니다!

comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE); 

참고 :

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class SwingControlDemo { 
    private JFrame mainFrame; 
    private JLabel headerLabel; 
    private JLabel statusLabel; 
    private JPanel controlPanel; 

    public SwingControlDemo() { 
     prepareGUI(); 
    } 

    public static void main(String[] args) { 
     SwingControlDemo swingControlDemo = new SwingControlDemo(); 
     swingControlDemo.showComboboxDemo(); 
    } 

    private void prepareGUI() { 
     mainFrame = new JFrame("Java Swing Examples"); 
     mainFrame.setSize(400, 400); 
     mainFrame.setLayout(new GridLayout(3, 1)); 
     mainFrame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent windowEvent) { 
       System.exit(0); 
      } 
     }); 
     headerLabel = new JLabel("", JLabel.CENTER); 
     statusLabel = new JLabel("", JLabel.CENTER); 

     statusLabel.setSize(350, 100); 

     controlPanel = new JPanel(); 
     controlPanel.setLayout(new FlowLayout()); 

     mainFrame.add(headerLabel); 
     mainFrame.add(controlPanel); 
     mainFrame.add(statusLabel); 
     mainFrame.setVisible(true); 
    } 

    private void showComboboxDemo() { 
     headerLabel.setText("Control in action: JComboBox"); 

     final DefaultComboBoxModel fruitsName = new DefaultComboBoxModel(); 

     fruitsName.addElement("Apple"); 
     fruitsName.addElement("Grapes"); 
     fruitsName.addElement("Mango"); 
     fruitsName.addElement("Peer"); 
     fruitsName.addElement("java"); 
     fruitsName.addElement("Mango"); 

     final JComboBox fruitCombo = new JComboBox(fruitsName); 
     fruitCombo.setSelectedIndex(0); 

     JScrollPane fruitListScrollPane = new JScrollPane(fruitCombo); 

     JButton showButton = new JButton("Show"); 

     fruitCombo.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       if (arg0.getModifiers() == ActionEvent.MOUSE_EVENT_MASK || arg0.getModifiers() == ActionEvent.KEY_EVENT_MASK || true) { 
        System.out.println("arg0" + " " + arg0.getModifiers()); 
       } 
      } 
     }); 

     fruitCombo.addKeyListener(new KeyListener() { 
      @Override 
      public void keyTyped(KeyEvent arg0) { 
       // TODO Auto-generated method stub 
      } 

      @Override 
      public void keyReleased(KeyEvent arg0) { 
       // TODO Auto-generated method stub 
       if (arg0.getKeyCode() == KeyEvent.VK_ENTER) { 
        System.out.println("enter key pressed" + arg0.getKeyCode()); 
       } 
      } 

      @Override 
      public void keyPressed(KeyEvent arg0) { 
       // TODO Auto-generated method stub 
      } 
     }); 

     System.out.println(fruitCombo.getComponentListeners().toString()); 
     controlPanel.add(fruitListScrollPane); 
     controlPanel.add(showButton); 
     mainFrame.setVisible(true); 
    } 
} 
+1

사이드 노트 :'mainFrame.addDefaultCloseOperation (WindowConstants.EXIT_ON_CLOSE);'mainFrame.addWindowListener (....' –

+1

참고 사항 2 :'X || true'는 항상 부울 값에 대해 'true'로 평가됩니다. 표현'X'를 제거하고'fruitCombo.addActionListener'의'actionPerformed' 구현에서'true |'를 제거하십시오 –

+0

마우스를 사용하여 작업을 수행 할 때 수정 자에 대한 특정 값을 확인하기 위해 추가했습니다. –

답변

0

Oracle Java는 마우스를 사용한 선택과 동등하지 않기 때문에이 문제점을 해결했습니다. 그러나 수정 프로그램을 사용하려면 키 "ComboBox.noActionOnKeyNavigation"을 사용하여 기본 SWING UI 속성을 변경해야합니다. SourceCode에서 구현 된 수정에서이 속성을 플래그로 사용하고 있습니다. true로 설정하면 키보드를 사용하는 JComboBox 선택이 Action 이벤트를 트리거하지 않습니다. 이 링크는 수정 프로그램에 대한 세부 정보를 제공합니다. 1.8.111 http://osdir.com/ml/swing-dev-java-openjdk/2013-01/msg00029.html

그래서 기본적으로 우리는이 차선을

UIManager.getLookAndFeelDefaults()를 추가해야이 오픈 JDK에서입니다하지만 난 오라클 JDK에서 확인했다 (사실 "ComboBox.noActionOnKeyNavigation")를 넣습니다.;

1

화살표 키를 사용하는 경우이 이벤트의 발사를 방지하기 위해 콤보 상자에서 설정할 수있는 특성이있다 당신이 (또는하지 않을 수) 수동을해야 할 수 있습니다 위의 속성을 사용할 때 팝업을 닫으십시오 :

/* 
    This works on non editable combo boxes 
*/ 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.plaf.basic.*; 
import javax.swing.text.*; 

public class ComboBoxAction extends JFrame implements ActionListener 
{ 
    public ComboBoxAction() 
    { 
     JComboBox<String> comboBox = new JComboBox<String>(); 
     comboBox.addActionListener(this); 

     comboBox.addItem("Item 1"); 
     comboBox.addItem("Item 2"); 
     comboBox.addItem("Item 3"); 
     comboBox.addItem("Item 4"); 

     // This prevents action events from being fired when the 
     // up/down arrow keys are used on the dropdown menu 

     comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE); 

     getContentPane().add(comboBox); 
     getContentPane().add(new JTextField(), BorderLayout.SOUTH); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     System.out.println(e.getModifiers()); 

     JComboBox comboBox = (JComboBox)e.getSource(); 
     System.out.println(comboBox.getSelectedItem()); 

     // make sure popup is closed when 'isTableCellEditor' is used 

//  comboBox.hidePopup(); 
    } 

    public static void main(String[] args) 
    { 
     ComboBoxAction frame = new ComboBoxAction(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

이 사용에 찬성하지 않습니다. 솔루션 : 나는 이것을 시도했지만 JcomboBox 버튼 모양이 바뀌 었습니다. 어떤 해결책이 있습니까? –

1

사용자 정의 키 바인딩 작업을 사용하여 하나의 솔루션을 발견했습니다. 이러한 변경 사항이있는 코드는 다음과 같습니다.

package abcd; 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.plaf.basic.BasicComboPopup; 

public class SwingControlDemo { 

    private JFrame mainFrame; 
    private JLabel headerLabel; 
    private JLabel statusLabel; 
    private JPanel controlPanel; 

    public SwingControlDemo(){ 
     prepareGUI(); 
    } 

    public static void main(String[] args){ 
     SwingControlDemo swingControlDemo = new SwingControlDemo();  
     swingControlDemo.showComboboxDemo(); 
    } 

    private void prepareGUI(){ 
     mainFrame = new JFrame("Java Swing Examples"); 
     mainFrame.setSize(400,400); 
     mainFrame.setLayout(new GridLayout(3, 1)); 
     mainFrame.addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent windowEvent){ 
      System.exit(0); 
     }   
     });  
     headerLabel = new JLabel("", JLabel.CENTER);   
     statusLabel = new JLabel("",JLabel.CENTER);  

     statusLabel.setSize(350,100); 

     controlPanel = new JPanel(); 
     controlPanel.setLayout(new FlowLayout()); 

     mainFrame.add(headerLabel); 
     mainFrame.add(controlPanel); 
     mainFrame.add(statusLabel); 
     mainFrame.setVisible(true); 
    } 

    private void showComboboxDemo(){          
     headerLabel.setText("Control in action: JComboBox"); 

     final DefaultComboBoxModel fruitsName = new DefaultComboBoxModel(); 

     fruitsName.addElement("Apple"); 
     fruitsName.addElement("Grapes"); 
     fruitsName.addElement("Mango"); 
     fruitsName.addElement("Peer"); 
     fruitsName.addElement("java"); 
     fruitsName.addElement("mkm"); 

     final JComboBox fruitCombo = new JComboBox(fruitsName); 
     fruitCombo.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("DOWN"), "cDownArrow"); 
     fruitCombo.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("UP"), "cUpArrow"); 
     Action customDownArrow = new AbstractAction() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      // TODO Auto-generated method stub 
      System.out.println("in"); 
      JComboBox box = (JComboBox)arg0.getSource(); 
      BasicComboPopup pop = (BasicComboPopup)box.getAccessibleContext().getAccessibleChild(0); 
      JList list = pop.getList(); 
      System.out.println("next index" + " "+ (list.getSelectedIndex()+1)%box.getItemCount()); 
      list.setSelectedIndex((list.getSelectedIndex()+1)%box.getItemCount()); 

     } 
    }; 

    Action customUpArrow = new AbstractAction() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      // TODO Auto-generated method stub 
      JComboBox box = (JComboBox)arg0.getSource(); 
      BasicComboPopup pop = (BasicComboPopup)box.getAccessibleContext().getAccessibleChild(0); 
      JList list = pop.getList(); 
      System.out.println("next index" + " "+ (list.getSelectedIndex()+1)%box.getItemCount()); 
      list.setSelectedIndex(((list.getSelectedIndex()-1)%box.getItemCount()+box.getItemCount())%box.getItemCount()); 
     } 
    }; 
     fruitCombo.getActionMap().put("cDownArrow",customDownArrow); 
     fruitCombo.getActionMap().put("cUpArrow", customUpArrow); 
     fruitCombo.setSelectedIndex(0); 

     JScrollPane fruitListScrollPane = new JScrollPane(fruitCombo);  

     JButton showButton = new JButton("Show"); 



     fruitCombo.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      if(arg0.getModifiers()==ActionEvent.MOUSE_EVENT_MASK || arg0.getModifiers()==ActionEvent.KEY_EVENT_MASK||true){ 
       System.out.println("arg0"+" "+arg0.getModifiers()); 
      } 


     } 
    }); 

     /*fruitCombo.addKeyListener(new KeyListener() { 

     @Override 
     public void keyTyped(KeyEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void keyReleased(KeyEvent arg0) { 
      // TODO Auto-generated method stub 
      if(arg0.getKeyCode()==KeyEvent.VK_ENTER){ 
       System.out.println("enter key pressed"+arg0.getKeyCode()); 
      } 

     } 

     @Override 
     public void keyPressed(KeyEvent arg0) { 
      // TODO Auto-generated method stub 

     } 
    });*/ 
     System.out.println(fruitCombo.getComponentListeners().toString()); 
     controlPanel.add(fruitListScrollPane);   
     controlPanel.add(showButton);  
     mainFrame.setVisible(true);    
    } 
} 
+0

이 대답은 적합하지 않습니다. 목록 요소에서 항목을 선택합니다. 나는 목록에서 선택에 따라 JcombBox에서 선택에 따라 JComboBox에 scrollBar가 이동한다고 믿습니다. 그래서 우리가이 답변에서 언급 한 것처럼하면 스크롤바는 선택에 따라 움직이지 않을 것입니다. –

관련 문제