- ベストアンサー
Enterキーでボタンを押すにはどうすればいいのでしょうか
色を指定するチェックボックスがあり,表示ボタンで指定された色の混色を表示するプログラムです. このプログラムに,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); } } } *******************************************************************
- みんなの回答 (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); } } }
その他の回答 (1)
- zozy
- ベストアンサー率60% (20/33)
まず、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(); } } }