2016-04-06 13 views
0

私は3つのボタンを作成しました。それらはそれぞれJFrameに2回表示されます。フレームの背景を変更するのに問題があります。 ActionListenersを設定しましたが、クリックすると何も変わりません。私はいくつかの助けを求めることができます。アクションリスナーの設定と背景の変更

public class MyButtons extends JPanel { 
    public static JFrame frame; 
    private JButton Red = new JButton("Red"); 
    private JButton Green = new JButton("Green"); 
    private JButton Blue = new JButton("Blue"); 

    public void InitializeButton() 
    {  
     Blue.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
      frame.setBackground(Color.BLUE); 
      } 
     }); 

     Green.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
      frame.setBackground(Color.GREEN); 
      } 
     }); 

     Red.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
      frame.setBackground(Color.RED); 
      } 
     }); 
    } 

    public MyButtons() {  
     InitializeButton(); 
     add(Red); 
     add(Green); 
     add(Blue);  
    } 

    public static void main(String[] args) { 
     frame = new JFrame(); 


     JPanel row1 = new MyButtons(); 
     JPanel row2 = new MyButtons(); 

     row1.setPreferredSize(new Dimension(250, 100)); 
     row2.setPreferredSize(new Dimension(250, 100)); 

     frame.setLayout(new GridLayout(3,2)); 
     frame.add(row1); 
     frame.add(row2); 
     frame.pack();   
     frame.setVisible(true); 
    } 

    } 
+0

1)フレームがパネルで完全に覆われているか、2) 'setBackground(..) 'の呼び出しがフレームのコンテンツペインに渡されていないようです。 - 2つのパネルを参照を保持し、BGを変更する3番目のパネルに追加する方がよいでしょう。 –

+0

ActionListenersに間違いありません。問題は、ContentPaneの背景がGridLayoutで覆われていることにあります。プログラムを実行し、任意のボタンを押してからJFrameのサイズを変更して試してみてください。サイズ変更するまでの時間の一部の間、背景色が表示されます。あなたのグラフィックスカードが速すぎる場合は、次のようなものを追加してください:System.out.println(frame.getBackground()。getBlue());あなたの青いActionListenerに。 Blueを押すたびに255が出力されます。 空の第3パネルをGridLayoutに追加し、フレームの代わりに色を変更します。 –

答えて

2

このコードは動作しますが、おそらくあなたが期待通り:

enter image description here

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

public class MyButtons extends JPanel { 

    //public static JFrame frame; 
    // static is rarely a solution of problems in a GUI. ToDo! Change! 
    static JPanel ui = new JPanel(new GridLayout(2, 0, 20, 20)); 

    private JButton Red = new JButton("Red"); 
    private JButton Green = new JButton("Green"); 
    private JButton Blue = new JButton("Blue"); 

    public void InitializeButton() { 
     Blue.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       ui.setBackground(Color.BLUE); 
      } 
     }); 

     Green.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       ui.setBackground(Color.GREEN); 
      } 
     }); 

     Red.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       ui.setBackground(Color.RED); 
      } 
     }); 
    } 

    public MyButtons() { 
     InitializeButton(); 
     add(Red); 
     add(Green); 
     add(Blue); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(250, 100); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 

     JPanel row1 = new MyButtons(); 
     JPanel row2 = new MyButtons(); 

     //row1.setPreferredSize(new Dimension(250, 100)); 
     //row2.setPreferredSize(new Dimension(250, 100)); 

     //frame.setLayout(new GridLayout(3, 2,10,10)); 
     ui.add(row1); 
     ui.add(row2); 
     frame.add(ui); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

N.B.一般的なJava命名法(命名規則 - EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttributeなどがUPPER_CASE_CONSTANTでない場合を除き)を習得し、一貫して使用してください。

+0

こんにちは@Andrew Thompson、もし私がそれをレイヤードカラーにしたいならどうしますか?たとえば、上のJpanelで赤が押された場合、上半分は赤、下の青は押され、青は下半分に表示されます。ボタンが互いに影響を与える方法はありますか?たとえば、赤いボタンを選択すると、背景全体が赤に変わります。 – Master

+0

この例では色の帯だけが表示される理由を理解できますか?あなたはそれのサイズを変更する方法を知っていますか? –

関連する問題