2011-09-05 4 views
12

私は、Javaアプリケーションでオン/オフのようなトグルスイッチを追加したいと思います。 Swing Slidersからそれらを構築する必要がありますか、それとも既に近いものがありますか? JScrollBarのを使用して、多分セクシーなオン/オフスライダーを追加するには?

http://www.premiumpixels.com/freebies/onoff-switches-and-toggles-psd/

http://modmyi.com/forums/iphone-2g-3g-3gs-ipod-touch-1g-2g-3g-new-skins-themes-launches/447951-release-off-slider-lockscreen.html

Apple uses toggle switches of the kind I'm describing in it's Desktop Applications too

Google uses toggle switches of the kind I'm describing in it's Web Applications too

+0

このような事はstandarスイングライブラリに存在しません。サードパーティライブラリを検索したり、自分で作成してみてください。私はJCheckBoxを使用します。 IPhoneコントロールは小さなタッチスクリーン用で、スイングコントロールはマウスを使用した大型デスクトップ画面用です。 –

+0

@simpaticoの共有に感謝+1 – mKorbel

答えて

1

、ここだけと未完了のアイデアはあなたに

enter image description here

次第であり、
import java.awt.*; 
import java.awt.event.AdjustmentEvent; 
import java.awt.event.AdjustmentListener; 
import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Sliders { 

    private JFrame frame; 
    private JPanel main; 
    private JPanel scrollBarPanel = new JPanel(); 
    private JPanel sliderPanel; 

    public Sliders() { 
     frame = new JFrame(); 
     main = new JPanel(new GridLayout(2, 1)); 
     final JScrollBar scrollBar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 100, 0, 200); 
     int height = scrollBar.getPreferredSize().height; 
     scrollBar.setPreferredSize(new Dimension(175, height)); 
     scrollBarPanel.add(scrollBar); 
     main.add(scrollBarPanel); 
     sliderPanel = new JPanel(); 
     final JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 255, 128); 
     slider.setMajorTickSpacing(48); 
     slider.setMinorTickSpacing(16); 
     slider.setPaintTicks(true); 
     sliderPanel.add(slider); 
     main.add(sliderPanel); 
     frame.add(main, BorderLayout.CENTER); 
     scrollBar.addAdjustmentListener(new AdjustmentListener() { 

      @Override 
      public void adjustmentValueChanged(AdjustmentEvent e) { 
       System.out.println("JScrollBar's current value = " + scrollBar.getValue()); 
      } 
     }); 
     slider.addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       System.out.println("JSlider's current value = " + slider.getValue()); 
      } 
     }); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       Sliders sliders = new Sliders(); 
      } 
     }); 
    } 
} 
+0

- 選択ロジック(別名:ButtonModel)を実装する必要があります。 – kleopatra

+0

@kleopatra hmmmいいよ、....、どこかで分かりません。方法http://stackoverflow.com/questions/4218117/sliding-window-under-a-jpanel/7291620#7291620、と錯覚以上の可能性があります、私が投稿したコードを更新するhesitageはありません – mKorbel

+0

興味深い+1 。 'JToggleButton'をアイコンで使用していましたが、' BoundedRangeModel'は '新しいJSlider(JSlider.HORIZONTAL、0、1、0)'で動作します。 – trashgod

2

組み込みコンポーネントJCheckBoxを使用します。

JCheckBox cb = new JCheckBox(createImageIcon("off-image.gif", "Click To Turn On")); 
cb.setSelectedIcon(createImageIcon("on-image.gif", "Click To Turn Off")); 
+0

+1再利用のため:-)ローカライズされたアイコンが必要ですが、それは大したことではありません – kleopatra

+0

ローカライズされたアイコンはどういう意味ですか?共有してください、私はまだJavaで学んでいます:) –

+0

英語よりも多くの言語があります(画像に示されています:) – kleopatra

19

ほんの少しの例ですが、おそらくそれが役に立ちます。

enter image description here

public class Popup extends JFrame { 

    public Popup() { 
     setBounds(100, 100, 300, 120); 
     setDefaultCloseOperation(3); 
     getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING, 10, 10)); 
     getContentPane().add(new JSwitchBox("on", "off")); 
     getContentPane().add(new JSwitchBox("yes", "no")); 
     getContentPane().add(new JSwitchBox("true", "false")); 
     getContentPane().add(new JSwitchBox("on", "off")); 
     getContentPane().add(new JSwitchBox("yes", "no")); 
     getContentPane().add(new JSwitchBox("true", "false")); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Popup().setVisible(true); 
      } 
     }); 
    } 

    public class JSwitchBox extends AbstractButton{ 
     private Color colorBright = new Color(220,220,220); 
     private Color colorDark = new Color(150,150,150); 
     private Color black = new Color(0,0,0,100); 
     private Color white = new Color(255,255,255,100); 
     private Color light = new Color(220,220,220,100); 
     private Color red = new Color(160,130,130); 
     private Color green = new Color(130,160,130); 
     private Font font = new JLabel().getFont(); 
     private int gap = 5; 
     private int globalWitdh = 0; 
     private final String trueLabel; 
     private final String falseLabel; 
     private Dimension thumbBounds; 
     private Rectangle2D bounds; 
     private int max; 


     public JSwitchBox(String trueLabel, String falseLabel) { 
      this.trueLabel = trueLabel; 
      this.falseLabel = falseLabel; 
      double trueLenth = getFontMetrics(getFont()).getStringBounds(trueLabel, getGraphics()).getWidth(); 
      double falseLenght = getFontMetrics(getFont()).getStringBounds(falseLabel, getGraphics()).getWidth(); 
      max = (int)Math.max(trueLenth, falseLenght); 
      gap = Math.max(5, 5+(int)Math.abs(trueLenth - falseLenght)); 
      thumbBounds = new Dimension(max+gap*2,20); 
      globalWitdh = max + thumbBounds.width+gap*2; 
      setModel(new DefaultButtonModel()); 
      setSelected(false); 
      addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseReleased(MouseEvent e) { 
        if(new Rectangle(getPreferredSize()).contains(e.getPoint())) { 
         setSelected(!isSelected()); 
        } 
       } 
      }); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(globalWitdh, thumbBounds.height); 
     } 

     @Override 
     public void setSelected(boolean b) { 
      if(b){ 
       setText(trueLabel); 
       setBackground(green); 
      } else { 
       setBackground(red); 
       setText(falseLabel); 
      } 
      super.setSelected(b); 
     } 
     @Override 
     public void setText(String text) { 
      super.setText(text); 
     } 

     @Override 
     public int getHeight() { 
      return getPreferredSize().height; 
     } 

     @Override 
     public int getWidth() { 
      return getPreferredSize().width; 
     } 

     @Override 
     public Font getFont() { 
      return font; 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      g.setColor(getBackground()); 
      g.fillRoundRect(1, 1, getWidth()-2 - 1, getHeight()-2 ,2 ,2); 
      Graphics2D g2 = (Graphics2D)g; 

      g2.setColor(black); 
      g2.drawRoundRect(1, 1, getWidth()-2 - 1, getHeight()-2 - 1, 2,2); 
      g2.setColor(white); 
      g2.drawRoundRect(1 + 1, 1 + 1, getWidth()-2 - 3, getHeight()-2 - 3, 2,2); 

      int x = 0; 
      int lx = 0; 
      if(isSelected()) { 
       lx = thumbBounds.width; 
      } else { 
       x = thumbBounds.width; 
      } 
      int y = 0; 
      int w = thumbBounds.width; 
      int h = thumbBounds.height; 

      g2.setPaint(new GradientPaint(x, (int)(y-0.1*h), colorDark , x, (int)(y+1.2*h), light)); 
      g2.fillRect(x, y, w, h); 
      g2.setPaint(new GradientPaint(x, (int)(y+.65*h), light , x, (int)(y+1.3*h), colorDark)); 
      g2.fillRect(x, (int)(y+.65*h), w, (int)(h-.65*h)); 

      if (w>14){ 
       int size = 10; 
       g2.setColor(colorBright); 
       g2.fillRect(x+w/2-size/2,y+h/2-size/2, size, size); 
       g2.setColor(new Color(120,120,120)); 
       g2.fillRect(x+w/2-4,h/2-4, 2, 2); 
       g2.fillRect(x+w/2-1,h/2-4, 2, 2); 
       g2.fillRect(x+w/2+2,h/2-4, 2, 2); 
       g2.setColor(colorDark); 
       g2.fillRect(x+w/2-4,h/2-2, 2, 6); 
       g2.fillRect(x+w/2-1,h/2-2, 2, 6); 
       g2.fillRect(x+w/2+2,h/2-2, 2, 6); 
       g2.setColor(new Color(170,170,170)); 
       g2.fillRect(x+w/2-4,h/2+2, 2, 2); 
       g2.fillRect(x+w/2-1,h/2+2, 2, 2); 
       g2.fillRect(x+w/2+2,h/2+2, 2, 2); 
      } 

      g2.setColor(black); 
      g2.drawRoundRect(x, y, w - 1, h - 1, 2,2); 
      g2.setColor(white); 
      g2.drawRoundRect(x + 1, y + 1, w - 3, h - 3, 2,2); 

      g2.setColor(black.darker()); 
      g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
      g2.setFont(getFont()); 
      g2.drawString(getText(), lx+gap, y+h/2+h/4); 
     } 
    } 
} 
+0

+1の汎用性。私は提供されたアイコンを切り抜くことを考えていましたが、これはローカライズが簡単です。 – trashgod

+1

+1セクシーさ。しかし、スライダーの感触は欠けています。すぐにmvnをインストールしてください。 mvn exec:java -Dexec.mainClass = "com.mysimpatico.sexybutton.Popup" http://dl.dropbox.com/u/23278095/SexyButton.zip – simpatico

+0

多分あなたは[この質問に答える](http: //stackoverflow.com/q/19273548/2853553) – mKorbel

関連する問題