2011-09-05 5 views
12

Java 응용 프로그램에서 on/off 토글 스위치를 추가하고 싶습니다. 스윙 슬라이더에서 빌드해야합니까? 아니면 이미 더 가까운 것이 있습니까? 여기섹시한 온/오프 슬라이더를 추가하는 방법?

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

하는 JScrollBar를 사용하여 어쩌면

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

+0

이러한 점은 standar을 스윙 라이브러리에 존재하지 않습니다. 타사 라이브러리를 검색하거나 직접 만들어보십시오. JCheckBox를 사용합니다. 아이폰 컨트롤은 작은 터치 스크린을위한 것이고, 스윙 것들은 마우스가있는 대형 데스크탑 스크린 크기를위한 것입니다. –

+0

@simpatico +1 – mKorbel

답변

1

, 단지 및 완료되지 않은 아이디어, 최대

enter image description here

,536,913 당신에게로
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

현지화 된 아이콘의 의미는 무엇입니까? 제발 공유, 제발 아직 자바와 함께 배우고 있어요 :) –

+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

관련 문제