을 흉내내는 줌 바로 사무실에서 2007 년에는 자바(수정 JSlider)
-
05-07-2019 - |
문제
내가 하려고 모방(또는 기존성)을 모방하는 줌에서 슬라이더 Word2007:
거기에 사이에는 두가지 주된 차이점이 이 구성 요소와 표준 Java JSlider:
- 스냅하지 않습 틱 제외에서 100%,그리고 스냅 동안 당신은 라이브 오히려할 때보다 마우스 릴리스
- 슬라이더는 선형이 아 전체에 걸쳐 길:왼쪽의 절반이 슬라이더에서 10%~100%;오른쪽에서 100%500%.
출처:
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.