2011-09-05 55 views
12

我想在Java應用程序中添加像開關一樣的開關。我是否需要從Swing滑塊構建它們,還是有更近的距離?如何添加性感開/關滑塊?

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

可能通過使用JScrollBar中,這裏只是和未完成的想法,給你

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嗯不錯嘛,...,I」迷失的地方,只有不知道這方式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 install; 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