java - 如何添加性感的开/关 slider ?

标签 java swing user-interface

我想在 Java 应用程序中添加一个开/关之类的切换开关。我需要从 Swing Sliders 构建它们还是已经有更接近的东西?

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

最佳答案

举个例子,也许对你有帮助。

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 );
        }
    }
}

关于java - 如何添加性感的开/关 slider ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7304017/

相关文章:

java - 在 Netbeans 8.0.2 中为 Android 应用程序创建数据库

swing - 如何在 java swing 中设置样式?

java - 网格袋背景图像

css - 水平 ul li 导航 Bootstrap

user-interface - 如何模仿用户点击调用 GUI 对象的回调函数?

Java - 动态加载类

java - 根据当前时区与东部时区的时差更改 LocalDateTime

java - Gradle : change is springboot version causes error

java - 重绘 JFrame 滞后/弹出

html - 需要文本为窗口的 100% 高度和宽度,不多也不少