電子書籍の厳選無料作品が豊富!

色を指定するチェックボックスがあり,表示ボタンで指定された色の混色を表示するプログラムです.
このプログラムに,Enterキーの入力に表示ボタンを押したのと同じ効果をもたせたいのですが,どうすればいいでしょうか.
また,requestFocusInWindow()をどこに挿入すればうまくいくのでしょうか.

***************************************************************
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class Q1 extends Applet implements ActionListener {

// チェックボックス3つとボタン1つ
Checkbox cbx1, cbx2, cbx3;
int red = -1, green, blue;
Button btn;

public void init() {
cbx1 = new Checkbox("Red");
cbx2 = new Checkbox("Green");
cbx3 = new Checkbox("Blue");
add(cbx1);
add(cbx2);
add(cbx3);

btn = new Button("Paint");
btn.addActionListener(this);
add(btn);

addKeyListener(new KeyAdapter() {
public void KeyPressed(KeyEvent ke) {
if (ke.getKeyCode() != KeyEvent.VK_ENTER) return;
SetColor();
repaint();
}
});
}

// ボタンを押したとき
public void actionPerformed(ActionEvent e) {
SetColor();
repaint();
}

// 色の設定
public void CheckColor() {
if (cbx1.getState()) red = 255;else red = 0;
if (cbx2.getState()) green = 255;else green = 0;
if (cbx3.getState()) blue = 255;else blue = 0;
}

// 色付き長方形の表示
public void paint(Graphics g) {
if (red != -1) {
g.setColor(new Color(red, green, blue));
g.fillRect(10, 50, getSize().width - 20, getSize().height - 40);
}
}
}
*******************************************************************

A 回答 (2件)

質問者様の元のコードがアプレットですので同じアプレットで


import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;


public class Q2 extends Applet implements ActionListener, FocusListener {

// チェックボックス3つとボタン1つ
Checkbox cbx1, cbx2, cbx3;
int red = -1, green, blue;
Button btn;

public void init() {

FocusWindow(this);
}

public void focusGained(FocusEvent e) {
// アプレットにフォーカスを与える。
this.requestFocusInWindow();

}

public void focusLost(FocusEvent e) {}

public void FocusWindow(FocusListener listener) {

this.addFocusListener(listener);
cbx1 = new Checkbox("Red");
cbx1.addFocusListener(listener);
cbx2 = new Checkbox("Green");
cbx2.addFocusListener(listener);
cbx3 = new Checkbox("Blue");
cbx3.addFocusListener(listener);

add(cbx1);
add(cbx2);
add(cbx3);

btn = new Button("Paint");

btn.addActionListener(this);
btn.addFocusListener(listener);


this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent ke) {
if (ke.getKeyCode() == KeyEvent.VK_ENTER) {


CheckColor();
repaint();
System.out.println("repaint");
}else{

char a=ke.getKeyChar();
System.out.println(a);
};
}
});
add(btn);

}

// ボタンを押したとき
public void actionPerformed(ActionEvent e) {
CheckColor();
repaint();

}

// 色の設定
public void CheckColor() {
if (cbx1.getState()) red = 255;else red = 0;
if (cbx2.getState()) green = 255;else green = 0;
if (cbx3.getState()) blue = 255;else blue = 0;
}

// 色付き長方形の表示
public void paint(Graphics g) {
if (red != -1) {
g.setColor(new Color(red, green, blue));
g.fillRect(10, 50, getSize().width - 20, getSize().height - 40);
}
}

}
    • good
    • 0

まず、awt ではなく、拡張版の swing を使いましょう。


swing の方が機能が充実しています。

以下が私が書き直したものです。

import javax.swing.JFrame;
// JFrame はアプリケーションの土台です
// この上に JPanelを追加しましょう
// 紙芝居でイメージすると
// JFrame = 外枠 JPanel = 中の紙となります
public class MainFrame extends JFrame{
private DisplayPanel display;
public MainFrame(){
setSize(408,234);
// ×を押したとき、正常にプログラムを終了するための処理
setDefaultCloseOperation(EXIT_ON_CLOSE);
// レイアウトを null に設定
setLayout(null);
display = new DisplayPanel();
display.setLocation(0,0);
add(display);
}
public static void main(String[] args) {
// MainFrame を可視状態にします
new MainFrame().setVisible(true);
}
}
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
// 色を表示するパネルです
public class DisplayPanel extends JPanel{
private ColorSetPanel colorSet;
private int red;
private int green;
private int brue;
public DisplayPanel(){
setSize(400,200);
setLayout(null);
// ColorSetPanel で DisplayPanel のインスタンスを
// 使うために displayPanel 自身を渡しています
colorSet = new ColorSetPanel(this);
colorSet.setLocation(0,0);
add(colorSet);
}
// swing のペイントメソッドです
// ダブルバッファ(ちらつき防止)が標準仕様です
public void paintComponent(Graphics g){
// このパネルだけに描画するため
super.paintComponent(g);
g.setColor(new Color(red,green,brue));
g.fillRect(0,50,getWidth(),getHeight()-50);
}
// SetColorPanel から色を変更するためのメソッド
public void setRed(int red){this.red=red;}
public void setGreen(int green){this.green=green;}
public void setBrue(int brue){this.brue=brue;}
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
// 色を設定するためのパネル
public class ColorSetPanel extends JPanel implements ChangeListener,ActionListener{
// チェックボックスのラベルの文字
// 万が一にも内容が変わってはいけないので定数にしました
private final String[] LABEL = {"red","green","brue"};
// 配列のすることで記述の行数を減らすことができます
private JCheckBox[] check;
private JButton button;
private DisplayPanel display;
// コンストラクタはインスタンス生成時(一番最初)に
// 呼ばれるメソッドです
// ここで DisplayPanel クラスのインスタンスを受け取ります
public ColorSetPanel(DisplayPanel display){
this.display = display;
setSize(400,50);
setLayout(null);
check = new JCheckBox[3];
for(int i=0;i<check.length;i++){
check[i] = new JCheckBox(LABEL[i]);
// ChangeEvent はコンポーネント(部品)の
// 内容が変わったら処理が呼ばれます
check[i].addChangeListener(this);
check[i].setBounds(i*100+10,10,80,30);
add(check[i]);
}
button = new JButton("Paint");
button.addActionListener(this);
// button にキーリスナーを登録
button.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
keyPress(e);
}
});
button.setBounds(310,10,80,30);
add(button);
}
public void stateChanged(ChangeEvent e){
if(check[0].isSelected())display.setRed(255);
else display.setRed(0);
if(check[1].isSelected())display.setGreen(255);
else display.setGreen(0);
if(check[2].isSelected())display.setBrue(255);
else display.setBrue(0);
// チェックボックスが押されたら
// フォーカスをボタンへ
button.requestFocusInWindow();
}
public void actionPerformed(ActionEvent e){
display.repaint();
}
private void keyPress(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_ENTER){
display.repaint();
}
}
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!