2011-07-06 15 views
2

A JPanelJScrollPaneには、JPanelまたは2が含まれています。私の人生は、キーボードの方向矢印を使ってスクロール速度を上げることに依存します。慎重な審議の末、sc.getVerticalScrollBar().setUnitIncrement(240);は、マウスにのみ適用されるべきであり、Java開発者の間で軽微な迷惑を引き出す賢明な綱引きであるべきです。スクロール速度を上げるためにできることはありますか?私の人生はバランスに欠けている。Java - JScrollPaneのキーボードスクロール速度を設定する方法

答えて

4

あなたJScrollPaneに含まれる成分のためのキーボードイベントをキャプチャし、JScrollPaneにフォーカスがあるとき、キーボードイベントを処理するためにInputMap.putActionMap.putの組み合わせを使用する必要があります。スクロールのデフォルトの増分値が1であるので、あなたが追加したり、あなたがJScrollPane.getVerticalScrollBar().getValue()を得ることができますJScrollPaneためのスクロールバーの現在の値に所望のインクリメント値をsubstractとJScrollPane.getVerticalScrollBar().setValue(int).

含まれる要素のためのイベントをキャプチャする例を設定する必要がありますwithing JScrollPaneには、私はボタンでやった、このコードで行うことができます、しかし、あなたは(不正なコードの組織のために申し訳ありませんが)ポイントを得る:と聞くこと

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

public class Test 
{ 
    public static void main(String[] args) 
    { 
     final JFrame f = new JFrame(""); 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(2000,1)); 


     for(int i = 0; i != 2000; i++) 
     { 
      JButton btn = new JButton("Button 2"); 
      panel.add(btn); 
     } 
     final JScrollPane sPane = new JScrollPane(panel); 
     final int increment = 5000; 
     sPane.getVerticalScrollBar().setUnitIncrement(increment); 

     KeyStroke kUp = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0); 
     KeyStroke kDown = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0); 

     sPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(kUp,"actionWhenKeyUp"); 
     sPane.getActionMap().put("actionWhenKeyUp", 
      new AbstractAction("keyUpAction") 
      { 
       public void actionPerformed(ActionEvent e) 
       { 
        final JScrollBar bar = sPane.getVerticalScrollBar(); 
        int currentValue = bar.getValue(); 
        bar.setValue(currentValue - increment); 
       } 
      } 
     ); 

     sPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(kDown,"actionWhenKeyDown"); 
     sPane.getActionMap().put("actionWhenKeyDown", 
      new AbstractAction("keyDownAction") 
      { 
       public void actionPerformed(ActionEvent e) 
       { 
        final JScrollBar bar = sPane.getVerticalScrollBar(); 
        int currentValue = bar.getValue(); 
        bar.setValue(currentValue + increment); 
       } 
      } 
     ); 
     f.add(sPane); 
     f.pack(); 



     SwingUtilities.invokeLater(
       new Runnable() 
       { 
        public void run() 
        { 
         f.setVisible(true); 
        } 
       } 
      ); 
    } 
} 

我々は登録してプロセスイベント:

sPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(kUp,"actionWhenKeyUp"); 
sPane.getActionMap().put("actionWhenKeyUp", 
    new AbstractAction("keyUpAction") 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      final JScrollBar bar = sPane.getVerticalScrollBar(); 
      int currentValue = bar.getValue(); 
      bar.setValue(currentValue - increment); 
     } 
    } 
); 

JScrollBarの値を実行するキーコードは、AbstractActionです(この場合、ユーザーがアップキーを押した場合)。

 public void actionPerformed(ActionEvent e) 
     { 
      final JScrollBar bar = sPane.getVerticalScrollBar(); 
      int currentValue = bar.getValue(); 
      bar.setValue(currentValue - increment); 
     } 

あなたがすべきことは、JScrollPaneにフォーカスがあるときにイベントを完了することですが、それは簡単なことです。

あなたの人生を救うのに役立ちたいと思っています:Pまたは少なくともあなたを出発点としてお手伝いします。

+0

うーん、あなたはAPIへのリンクを提供していますが、述べAPI読んでいない:「)このメソッドは廃止されましたが、getActionMap(の組み合わせを使用してくださいとgetInputMap()似の挙動について。」 。ただし、Key Bindingsを使用すると、+1することができます。 – camickr

+0

申し訳ありませんが、私の答えでそれを述べていません。 –

+0

廃止予定のAPI使用の問題を修正しました –

2

おそらくあなたが探しているものではありませんが、Mouse Wheel Controllerを使用すると、マウスを使用してスクロールする速度を上げることができます。

私の人生は、キーボードの方向矢印を使用してスクロール速度を上げることによって決まります。

キーボードの使用時にスクロールペインをどのようにスクロールさせるのかよくわかりません。私はキーボードの矢印を使用すると、スクロールペインをスクロールすることができません。この問題を示すSSCCEを投稿してください。

編集:私の簡単なテストのために

私はちょうどスクロールペインへのJLabelを追加しました。 JLabelにはデフォルトでフォーカスが設定されていないため、スクロールペインのコンポーネントにはフォーカスがないため、スクロールバーのデフォルトのアクションは呼び出されません。ラベルをフォーカス可能にすることで、キーボードスクロールが機能します。

0
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.util.Random; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollBar; 
import javax.swing.JScrollPane; 
import javax.swing.JViewport; 
import javax.swing.event.MouseInputAdapter; 

public class testeSLider extends JFrame { 
    private JPanel jp; 
    private JScrollPane sc; 

    public testeSLider() { 
     setVisible(true); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setResizable(false); 
     setLocationRelativeTo(null); 
     setSize(new Dimension(820, 130)); 
     setBackground(Color.BLACK); 
     jp = new JPanel(); 
     sc = new JScrollPane(jp); 
     jp.setBackground(Color.GRAY); 

     sc.setBounds(0, 0, 100, 400); 
     sc.setBackground(Color.DARK_GRAY); 
     sc.getHorizontalScrollBar().setPreferredSize(new Dimension(0, 0)); 
     sc.setBounds(50, 30, 300, 50); 

     getContentPane().add(sc); 

     int x = 0; 
     for (int i = 0; i < 50; i++) { 
      JPanel item = new JPanel(); 
      x = (87 * i) + (i * 10); 

      item.setBackground(Color.getHSBColor(new Random().nextInt(255), 
        new Random().nextInt(255), new Random().nextInt(255))); 
      item.setBounds(x, 5, 0, 0); 
      item.setPreferredSize(new Dimension(90, 90)); 
      jp.add(item); 
      addEfeito(item); 
     } 

    } 

    private void addEfeito(JPanel item) { 

     MouseInputAdapter adapter = new MouseInputAdapter() { 
      private JPanel panelTmp; 
      private int deslocamento = 3; 
      private int mouseStartX; 
      private int mouseStartY; 

      @Override 
      public void mouseDragged(MouseEvent e) { 

       final JScrollBar bar = sc.getHorizontalScrollBar(); 
       int currentValue = bar.getValue(); 
       bar.setValue(currentValue + (mouseStartX - e.getX())); 
      } 

      @Override 
      public void mouseEntered(MouseEvent e) { 
       panelTmp = ((JPanel) e.getSource()); 
       panelTmp.setBounds(panelTmp.getX(), panelTmp.getY(), 
         panelTmp.getWidth() + deslocamento, 
         panelTmp.getHeight() + deslocamento); 

      } 

      @Override 
      public void mouseExited(MouseEvent e) { 
       panelTmp = ((JPanel) e.getSource()); 

       panelTmp.setBounds(panelTmp.getX(), panelTmp.getY(), 
         panelTmp.getWidth() - deslocamento, 
         panelTmp.getHeight() - deslocamento); 

      } 

      @Override 
      public void mouseClicked(MouseEvent e) { 
       mouseStartX = e.getX(); 
       mouseStartY = e.getY(); 
      } 

      @Override 
      public void mousePressed(MouseEvent e) { 
       mouseStartX = e.getX(); 
       mouseStartY = e.getY(); 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 

      } 
     }; 
     item.addMouseListener(adapter); 
     item.addMouseMotionListener(adapter); 

    } 

    public static void main(String args[]) { 
     new testeSLider(); 
    } 

} 
関連する問題