2016-04-06 4 views
0

3 düğme oluşturduk. Her biri bir JFrame'de iki kez görüntülenir. Çerçevenin arka planını değiştirirken sorun yaşıyorum. ActionListeners'ı ayarlıyorum ama tıklama üzerine hiçbir şey değişmiyor. Biraz yardım isteyebilir miyim. Eğer beklendiği gibiAyar Eylem Dinleyici ve arka plan değiştirme

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

Görünüşe göre 1) çerçeve tamamen panellerle kaplanmış veya 2) 'setBackground (..) 'çağrısı çerçevenin içerik bölmesine aktarılmıyor. - İki paneli, referans tuttuğunuz ve BG'yi değiştirebileceğiniz üçüncü bir panele eklemeniz daha iyi bir strateji olacaktır. –

+0

ActionListeners'ınızda yanlış bir şey yoktur. Sorun, ContentPane'inizin arka planının GridLayout tarafından kapsandığı gerçeğinde yatmaktadır. Programınızı çalıştırarak, herhangi bir tuşa basarak ve ardından JFrame'i yeniden boyutlandırarak deneyin. Yeniden boyutlandırılana kadar arka plan rengini bir süre için göreceksiniz. Grafik kartınız bunun için çok hızlıysa, şunun gibi bir şey ekleyin: System.out.println (frame.getBackground(). GetBlue()); Blue ActionListener’ınıza Mavi düğmesine her bastığınızda 255 basılmalıdır. GridLayout'a boş bir üçüncü panel eklerim ve çerçevenin yerine rengini değiştiririm. –

cevap

2

Bu kod muhtemelen çalışır, ancak:

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. Lütfen ortak Java nomenklatürünü (adlandırma kurallarını - ör. EachWordUpperCaseClass, firstWordLowerCaseMethod(), firstWordLowerCaseAttributeUPPER_CASE_CONSTANT) ve tutarlı bir şekilde kullanın.

+0

Merhaba @ Andnd Thompson, ne olursa olsun renk katmanı istedim. Örneğin, üst Jpanel'de kırmızıya basılırsa, üst yarısı için kırmızı görüntülenir, alttaki mavi basılır, ardından alt yarıda mavi olur. Bir düğmenin birbirini etkilemesi için bir yol var mı? Örneğin, Kırmızı butonu seçersem, arkaplanın tamamı kırmızıya dönüşmelidir. – Master

+0

Bu örneğin neden sadece bir renk bandı gösterdiğini anlıyor musunuz? Büyüklüğünü nasıl değiştireceğini biliyor musun? –