From window, to wind

趣味のゲームとJavaプログラムなどについて 適当に書き綴るブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

拡大縮小用コンポーネントたたき台

とりあえずたたき台です。値を渡すためのメソッドをまだ用意してません。そのうちメソッドを追加して画像等の拡大縮小表示プログラムにします。
ソースコード
package program;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;

import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;

public class ScalePanel extends JPanel{

LSlider js;
LComboBox jcb;
JButton plus, minus;
int dx = 18, datalength;
Dimension bsize = new Dimension(dx,dx),
cbsize = new Dimension(3*dx,dx), ssize = new Dimension(5*dx,dx);
boolean shiftkey=false;

ScalePanel(int[] data){
datalength=data.length;
String[] str = new String[datalength];
for(int i=0;i<datalength;i++){
str[i] = "" + data[i] + "%";
}

URL urlp1 = this.getClass().getResource("buttonicon/plusoff.png");
URL urlp2 = this.getClass().getResource("buttonicon/pluson.png");
URL urlp3 = this.getClass().getResource("buttonicon/pluspush.png");
URL urlm1 = this.getClass().getResource("buttonicon/minusoff.png");
URL urlm2 = this.getClass().getResource("buttonicon/minuson.png");
URL urlm3 = this.getClass().getResource("buttonicon/minuspush.png");

plus = new JButton(new ImageIcon(urlp1));
plus.setPressedIcon(new ImageIcon(urlp3));
plus.setRolloverIcon(new ImageIcon(urlp2));
plus.setPreferredSize(bsize);
plus.setContentAreaFilled(false);
plus.setFocusable(false);
minus = new JButton(new ImageIcon(urlm1));
minus.setPressedIcon(new ImageIcon(urlm3));
minus.setRolloverIcon(new ImageIcon(urlm2));
minus.setPreferredSize(bsize);
minus.setContentAreaFilled(false);
minus.setFocusable(false);

plus.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae) {
slidershift(1);
}
});

minus.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae) {
slidershift(-1);
}
});

js = new LSlider(0,datalength-1,0);
js.setPreferredSize(ssize);
js.setFocusable(false);
js.setMajorTickSpacing(1);//目盛間隔(大)を設定
js.setPaintTicks(true);//目盛を表示
js.setSnapToTicks(true);//目盛に移動
js.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent ce) {
//System.out.println(js.getValue());
if(shiftkey){
jcb.setSelectedIndex(js.getValue(),false);
}else{
shiftkey=true;
jcb.setSelectedIndex(js.getValue(),true);
}
}
});

DefaultComboBoxModel dcbm = new DefaultComboBoxModel(str);
jcb = new LComboBox(dcbm);
jcb.setPreferredSize(cbsize);
jcb.setEditable(true);
dcbm.addListDataListener(new ListDataListener(){
public void contentsChanged(ListDataEvent lda) {
if(shiftkey){
js.setValue(jcb.getSelectedIndex(),false);
}else{
shiftkey=true;
js.setValue(jcb.getSelectedIndex(),true);
}
}

public void intervalAdded(ListDataEvent lda) {

}

public void intervalRemoved(ListDataEvent lda) {

}

});

GBLayout.addGB(minus, this, 0, 0, 1, 1);
GBLayout.addGB(jcb, this, 1, 0, 1, 1);
GBLayout.addGB(plus, this, 2, 0, 1, 1);
GBLayout.addGB(js, this, 0, 1, 1, 3);
}

private void slidershift(int num){
int nowval = js.getValue()+num;
if(nowval<=0)nowval=0;
if(nowval>=datalength-1)nowval=datalength-1;
js.setValue(nowval,false);

jcb.setSelectedIndex(nowval,false);
}

public void updata(){
//System.out.println("updata");
shiftkey=false;
}

public class LSlider extends JSlider{
LSlider(int min, int max, int value){
super(min,max,value);
}

public void setValue(int n ,boolean key){
this.setValue(n);
if(key)updata();
}
}

public class LComboBox extends JComboBox{
LComboBox(ComboBoxModel aModel){
super(aModel);
}

public void setSelectedIndex(int anIndex, boolean key){
this.setSelectedIndex(anIndex);
if(key)updata();
}
}
}


呼び出し部分

int[] data = new int[5];

data[0]=100;
data[1]=200;
data[2]=300;
data[3]=400;
data[4]=500;

ScalePanel sp = new ScalePanel(data);


表示例

imgbox.jpg
プラスマイナスのアイコンのボタンを押すとコンボボックスとスライダーが動くようにしてあり、変更後updata()メソッドが一度だけ呼び出されます。使うときはupdata()メソッドをオーバーライドして別の処理をする予定です。スライダーとコンボボックスを使うときもupdata()メソッドが呼び出されます。ただしスライダーを動かす時はデフォルトでChangeEventが3度呼び出されてしまうので注意が必要です。
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://kagenyan.blog69.fc2.com/tb.php/56-6d6850f3
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。