ページ 11

初期化されないようにするには

Posted: 2013年2月15日(金) 07:11
by daj
javaです。
以下は私が作成しているプログラムの簡易版です。
チェックボックスにチェックを入れると画面にtestと表示され、ボタンを押すと初期化されます。
このボタンを押した時、チェックボックスのチェックの状態が初期化されないようにするにはどうすればいいでしょうか?

コード:

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test1{
	public static void main(String[] args){
		JFrame frame = new JFrame("test");
		Test test=new Test(frame);
		frame.setBounds(100,100,807,633);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		frame.setResizable(false);
		frame.add(test);
	}
}
class Test extends JPanel implements MouseListener,ActionListener{
	JButton button;
	Boolean cc=true;
	JCheckBox change;
	Test(final JFrame frame){
		setLayout(null);
		button=new JButton("New");
		button.setBounds(679,75,112,23);
		button.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				frame.remove(Test.this);
				frame.add(new Test(frame));
				frame.validate();
			}
		});
		add(button);
		change=new JCheckBox("変更");
		change.setBounds(675,98,118,23);
		change.setOpaque(false);
		change.setSelected(true);
		change.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(cc==true)
					cc=false;
				else
					cc=true;
			}
		});
		add(change);
	}
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		if(cc==true)
			g.drawString("test",180,260);
		repaint();
	}
	public void mousePressed(MouseEvent e){}
	public void mouseReleased(MouseEvent e){
		
	}
	public void mouseClicked(MouseEvent e){}
	public void mouseEntered(MouseEvent e){}
	public void mouseExited(MouseEvent e){}
	public void actionPerformed(ActionEvent e){
	}
}

Re: 初期化されないようにするには

Posted: 2013年2月15日(金) 07:23
by みけCAT
パネルを取り除く前にチェックボックスの状態を保存し、
次のパネルを生成するときにコンストラクタでチェックボックスの状態を設定する、というのはどうでしょうか?

Re: 初期化されないようにするには

Posted: 2013年2月15日(金) 15:42
by daj
返信ありがとうございます。
一応作りたい通りの動きをするようになりましたが、返信内容的にこう直した方がいいという事なのでしょうか?
それとも違って、もっと良い書き方があったでしょうか?

コード:

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test1{
	public static void main(String[] args){
		JFrame frame = new JFrame("test");
		Test test=new Test(frame,true);
		frame.setBounds(100,100,807,633);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		frame.setResizable(false);
		frame.add(test);
	}
}
class Test extends JPanel implements MouseListener,ActionListener{
	JButton button;
	Boolean cc;
	JCheckBox change;
	Test(final JFrame frame,final boolean c){
		setLayout(null);
		button=new JButton("New");
		button.setBounds(679,75,112,23);
		button.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				frame.remove(Test.this);
				frame.add(new Test(frame,cc));
				frame.validate();
			}
		});
		add(button);
		if(cc==null)
			cc=c;
		change=new JCheckBox("変更");
		change.setBounds(675,98,118,23);
		change.setOpaque(false);
		change.setSelected(cc);
		change.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(cc==true)
					cc=false;
				else
					cc=true;
			}
		});
		add(change);
	}
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		if(cc==true)
			g.drawString("You Win です!",180,260);
		repaint();
	}
	public void mousePressed(MouseEvent e){}
	public void mouseReleased(MouseEvent e){}
	public void mouseClicked(MouseEvent e){}
	public void mouseEntered(MouseEvent e){}
	public void mouseExited(MouseEvent e){}
	public void actionPerformed(ActionEvent e){
	}
}

Re: 初期化されないようにするには

Posted: 2013年2月15日(金) 15:49
by daj
よく考えたらifいらなかったですね…
あと、あのあと少しいじっていたので最初の投稿とプログラム内容少し変わってるの忘れてました(といっても表示している文字が違う程度ですが)
連続投稿すみません。

コード:

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test1{
	public static void main(String[] args){
		JFrame frame = new JFrame("test");
		Test test=new Test(frame,true);
		frame.setBounds(100,100,807,633);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		frame.setResizable(false);
		frame.add(test);
	}
}
class Test extends JPanel implements MouseListener,ActionListener{
	JButton button;
	Boolean cc;
	JCheckBox change;
	Test(final JFrame frame,final boolean c){
		setLayout(null);
		button=new JButton("New");
		button.setBounds(679,75,112,23);
		button.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				frame.remove(Test.this);
				frame.add(new Test(frame,cc));
				frame.validate();
			}
		});
		add(button);
		cc=c;
		change=new JCheckBox("変更");
		change.setBounds(675,98,118,23);
		change.setOpaque(false);
		change.setSelected(cc);
		change.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				if(cc==true)
					cc=false;
				else
					cc=true;
			}
		});
		add(change);
	}
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		if(cc==true)
			g.drawString("test",180,260);
		repaint();
	}
	public void mousePressed(MouseEvent e){}
	public void mouseReleased(MouseEvent e){}
	public void mouseClicked(MouseEvent e){}
	public void mouseEntered(MouseEvent e){}
	public void mouseExited(MouseEvent e){}
	public void actionPerformed(ActionEvent e){
	}
}

Re: 初期化されないようにするには

Posted: 2013年2月15日(金) 21:21
by みけCAT
自分の返信の解釈は大丈夫です。

コード:

Test(final JFrame frame) {
    this(frame,true);
}
というコンストラクタを追加すると、最初にTestオブジェクトを作るときにboolean値を指定せずに作れます。

コード:

if(cc==true)
    cc=false;
else
    cc=true;
ここは単純に

コード:

cc=!cc;
でいいのではないでしょうか?

Re: 初期化されないようにするには

Posted: 2013年2月15日(金) 22:44
by ISLe
daj さんが書きました:それとも違って、もっと良い書き方があったでしょうか?
前にあった別の質問への回答に書いたのですが、シーン遷移を管理する仕組みをはさめば良いのではないでしょうか。

合わせていろいろ変更してます。

コード:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

interface SceneManager {
	public void changeScene();
	public void updateScene();
}

public class Test1 extends JFrame implements SceneManager {
	JButton button;
	JCheckBox change;
	Test panel;
	int count;
	public Test1() {
		super("test");

		button=new JButton("New");
		button.setBounds(679,75,112,23);
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				changeScene(); // シーン変更
			}
		});
		change=new JCheckBox("変更");
		change.setBounds(675,98,118,23);
		change.setOpaque(false);
		change.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				updateScene(); // シーン更新
			}
		});

		changeScene(); // 最初のシーン作成

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setResizable(false);
		setBounds(100,100,807,633);
	}
	public void changeScene() {
		if (panel != null)
			remove(panel);
		panel = new Test(++count);
		panel.setLayout(null);
		panel.add(button);
		panel.add(change);
		add(panel);
		validate();
		updateScene();
	}
	public void updateScene() {
		panel.setSelected(change.isSelected());
		repaint();
	}
	public static void main(String[] args) {
		new Test1().setVisible(true);
	}
}
class Test extends JPanel {
	boolean cc;
	int number;
	public Test(int number) {
		this.number = number;
	}
	public void setSelected(boolean selected) {
		cc = selected;
	}
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		if(cc)
			g.drawString("test "+number,180,260);
	}
}

Re: 初期化されないようにするには

Posted: 2013年2月16日(土) 05:01
by daj
皆さん返信ありがとうございます
ifの部分ってあそこまで簡略化できたんですね…
シーン遷移は、勉強不足だったので組み方?が分からなかったので避けてた感じです。
今のプログラムもその方向に変えてみることにします。