문제

내가 하려고 모방(또는 기존성)을 모방하는 줌에서 슬라이더 Word2007:

Two state zoom bar

거기에 사이에는 두가지 주된 차이점이 이 구성 요소와 표준 Java JSlider:

  1. 스냅하지 않습 틱 제외에서 100%,그리고 스냅 동안 당신은 라이브 오히려할 때보다 마우스 릴리스
  2. 슬라이더는 선형이 아 전체에 걸쳐 길:왼쪽의 절반이 슬라이더에서 10%~100%;오른쪽에서 100%500%.

여기에 나는 지금까지:Java clone

출처:

    import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 *
 * @author NDUNN
 * @date Nov 25, 2009
 */
public class ZoomBar extends JPanel implements ActionListener, ChangeListener {

    private JLabel zoomAmount;
    private JButton minus;
    private JButton plus;
    private JSlider slider;

    private static final int MIN_ZOOM = 10;
    private static final int MAX_ZOOM = 200;
    private static final int DEFAULT_ZOOM = 100;

    private static final int MAJOR_ZOOM_SPACING = 50;
    private static final int MINOR_ZOOM_SPACING = 10;

    public ZoomBar() {
        super();

        minus = new JButton("-");
        plus = new JButton("+");
        slider = new JSlider(MIN_ZOOM, MAX_ZOOM, DEFAULT_ZOOM);

        slider.setMinorTickSpacing(MINOR_ZOOM_SPACING);
        slider.setMajorTickSpacing(MAJOR_ZOOM_SPACING);
        slider.setPaintTicks(true);
        slider.setSnapToTicks(true);

        zoomAmount = new JLabel(slider.getValue() + "%");

        add(zoomAmount);
        add(minus);
        add(slider);
        add(plus);

        plus.addActionListener(this);
        minus.addActionListener(this);

        slider.addChangeListener(this);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Zoom bar clone");
        frame.setContentPane(new ZoomBar());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == plus) {
            slider.setValue(slider.getValue() + MINOR_ZOOM_SPACING);
        }
        else if (e.getSource() == minus) {
            slider.setValue(slider.getValue() - MINOR_ZOOM_SPACING);
        }
    }

    public void stateChanged(ChangeEvent e) {
        if (slider.getValueIsAdjusting()) {
            return;
        }
        zoomAmount.setText(slider.getValue() + "%");
    }

}

기본적으로 그냥을 흉내내 보이지 않고 이 두 기능은 위에서 언급된다.나는 아무 것도 보이지 않으로서 JSlider API 을 얻을 수 있는 이 동작을 수행할 수 없습니다.나는 처음부터 다시 시작해야하는가?그렇다면 그 가치가 있지 않지만,누구나 알고있는 경우의 좋은 방법이 이 문제,나는 생각한 것을 가지고 좋은 프로젝트에서 일하고 있어요.

감사합니다,


편집:

감사 PSpeed 에 대한 아이디어에 대한 매핑 0..50 50..100 을 다른 값입니다.이렇게 하는 코드는 아래와 같습니다.

불행하게도 생각이 변화에 대해 setValue 스냅 작동하지 않았습니다.

public void stateChanged(ChangeEvent e) {
    // While slider is moving, snap it to midpoint
    int value = slider.getValue();
    if (slider.getValueIsAdjusting()) {
        return;
    }

    zoomValue = fromSlider(value);
    zoomLabel.setText(zoomValue + "%");
}

public int fromSlider(int sliderValue) {
    int mappedValue = 0;
    if (sliderValue <= 50) {
        // Map from [0, 50] to [MIN ... DEFAULT]
        mappedValue = (int) map(sliderValue, 0, 50, MIN_ZOOM, DEFAULT_ZOOM);
    }
    else {
        // Convert from  (50, 100] to (DEFAULT ... MAX]
        mappedValue = (int) map(sliderValue, 50, 100, DEFAULT_ZOOM, MAX_ZOOM);
    }
    return mappedValue;
}

public int toSlider(int modelValue) {
    int mappedValue = 0;
    if (modelValue <= DEFAULT_ZOOM) {
        // Map from [MIN_ZOOM, DEFAULT_ZOOM] to [0 ... 50]
        mappedValue = (int) map(modelValue, MIN_ZOOM, DEFAULT_ZOOM, 0, 50);
    }
    else {
        // Convert from  (DEFAULT ... MAX] to (50, 100]
        mappedValue = (int) map(modelValue, DEFAULT_ZOOM, MAX_ZOOM, 50, 100);
    }
    return mappedValue;
}


/**
 * @param value The incoming value to be converted
 * @param low1  Lower bound of the value's current range
 * @param high1 Upper bound of the value's current range
 * @param low2  Lower bound of the value's target range
 * @param high2 Upper bound of the value's target range
 * @return
 */
public static final double map(double value, double low1, double high1, double low2, double high2) {

    double diff = value - low1;
    double proportion = diff / (high1 - low1);

    return lerp(low2, high2, proportion);
}

public static final double lerp(double value1, double value2, double amt) {
    return ((value2 - value1) * amt) + value1;
}

Edit2:다른 하나의 차이 나는지는 JButton 지 않는 당신이 누른 상태에서 화재 버튼을 여러 번 반면,+/-버튼 사무실 않습니다.어떤 방법을 모방하는 이?

도움이 되었습니까?

해결책

을 얻을 수 있습니다 믿는 이 모든 행동과 함께 사용자 지정 BoundedRangeModel.키을 모형을 만드 보고서 정상적인 유형의 값의 범위는 하지만 다르게 처리할 zoom 요소입니다.

그래서 예를 들어,당신은 당신의 범위는 0-100,당신은 치료 0-50 방법 중 하나와 50-100 는 또 다른 방법(10-100%과 100-500 의%각).

을 얻 스냅 동작,내가 확신할 수 있습니다 그냥 무시 setValue()스냅 범위를 당하고 싶습니다.그래서 사용 0-100 으로 값의 범위는 경우,setValue()를 호출하 47-53 로 한 다음 스냅 값 50.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top