2013-07-24 5 views
3

У меня возникли проблемы с установкой класса Panel в мой основной класс. Я не могу создать экземпляр и зарегистрировать кнопки для метода actionPerformed. Этот проект предполагает использование макета сетки с 9 кнопками ввода (3 других кнопки для ввода, пробела и четкости). Затем отобразите вход в JTextArea. Я считаю, что я правильно настроил Panel, но имею проблемы с объединением массива JButton, а затем зарегистрировал его в методе actionPerformed. Любые указатели будут очень благодарны. (Сторона вопроса, как вы копировать код с причем все размещено в блоке кода?)JPanel, экземпляр массива JButtons

import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 

public class TextButtons extends JFrame implements ActionListener { 

    private JButton[] buttons; 
    private JTextArea textArea; 
    private final int ENTER; //Index of Enter button in buttons 
    private final int SPACE; //Index of Space button in buttons 
    private final int CLEAR; //Index of Clear button in buttons 

    public TextButtons(String title) { 
     super(title); 
     JFrame frame = new JFrame("Text Button"); 

     //TODO: instantiate all JButtons, add them to the buttons array, 
     // and register "this" as the ActionListener for each button. 

     for (int i = 0; i < buttons.length; i++) { 
      buttons[i] = new JButton(); 
      //this.buttons.addActionListener(e); 
     } 

     ENTER = 9; 
     SPACE = 10; 
     CLEAR = 11; 
     buttons[ENTER] = new JButton("\n"); 
     buttons[SPACE] = new JButton(" "); 
     buttons[CLEAR] = new JButton("clear"); 

     JTextArea textArea = new JTextArea(); 
     textArea.setEditable(false); 

     TextButtonsPanel mainPanel = new TextButtonsPanel(buttons, textArea); 

     this.getContentPane().add(mainPanel); 
     this.pack(); 
     this.setVisible(true); 
    } 

    /* (non-Javadoc) 
    * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) 
    */ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     // ?? 
    } 

    public static void main(String[] args) { 
     final TextButtons f = new TextButtons("Text Buttons"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

PanelClass

public class TextButtonsPanel extends JPanel { 

     public TextButtonsPanel(JButton[] buttons, JTextArea textArea) { 

      int ENTER = 11; 

      JPanel mainPanel = new JPanel(new GridLayout(4, 3)); 

      JButton b1 = new JButton("A"); 
      JButton b2 = new JButton("B"); 
      JButton b3 = new JButton("C"); 
      JButton b4 = new JButton("1"); 
      JButton b5 = new JButton("2"); 
      JButton b6 = new JButton("3"); 
      JButton b7 = new JButton("X"); 
      JButton b8 = new JButton("Y"); 
      JButton b9 = new JButton("Z"); 

      add(b1); 
      mainPanel.add(b2); 
      mainPanel.add(b3); 
      mainPanel.add(b4); 
      mainPanel.add(b5); 
      mainPanel.add(b6); 
      mainPanel.add(b7); 
      mainPanel.add(b8); 
      mainPanel.add(b9); 

      JScrollPane scrollPane = new JScrollPane(textArea); 
      scrollPane.setPreferredSize(new Dimension(80, 120)); 
      mainPanel.add(scrollPane); 
     } 
    } 
} 
+0

//this.buttons.addActionListener(e); должны быть кнопки [i] .addActionListener (это); –

+0

1) Используйте последовательный и логический отступ для кодовых блоков. Отступ кода предназначен для того, чтобы помочь людям понять поток программы. 2) Чтобы получить более эффективную помощь, опубликуйте [SSCCE] (http://sscce.org/). 3) * «Боковой вопрос» * На самом деле это «единственный вопрос» в этом тексте. –

+0

@MehulRathod Посмотрите внимательно. Кнопки, добавленные в массив, никогда не используются – MadProgrammer

ответ

2

Ваш TextButtonsPanel расширяет JPanel, но вы добавляете все к JPanel под названием mainPanel, который никогда не добавляется ни к чему.

Поскольку JButton s являются локальными переменными, вы никогда не сможете подключить к ним внешний ActionListener. Не уверен, что это хорошо или плохо.

Я бы создал TextButtonsPane, который содержал ничего, кроме кнопок, не имел других компонентов. Все, что он делает, это генерировать события.

Я бы предоставил addActionListener и removeActionListener, которые просто зарегистрировали бы прослушиватель для всех кнопок, содержащихся в нем.

Таким образом, на панели кнопок все равно, для чего оно используется, это просто события, которые можно использовать для чего-то другого.

Вы можете занять некоторое время, чтобы прочитать Creating a GUI with Swing

+0

'Your TextButtonsPanel расширяет JPanel, но вы добавляете все в JPanel, называемый mainPanel'. Операция делала то же самое с JFrame. Там, очевидно, есть путаница. – 7stud

+0

Я собираюсь пересмотреть GUI Swing api docs. Я думаю, что у меня есть фундаментальная основа в голове. благодаря –

2

Я не могу создать экземпляр и зарегистрировать кнопки метода actionPerformed.

Вы можете организовать свой код так:

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

class TextButtonPanel extends JPanel implements ActionListener { 

    public TextButtonPanel(String[] labels) { 
     setLayout(new GridLayout(0, 3)); //same as self.setLayout(..) 

     JButton button; 

     for (String label : labels) { 
      button = new JButton(label); 
      button.addActionListener(this); 
      add(button); //same as self.add(button) 
     } 
    } 

    public void actionPerformed(ActionEvent e) { 
     JButton button = (JButton) e.getSource(); 
     System.out.println(button.getText()); 
    } 

} 


class MyGui { 

    public MyGui() { 
     JFrame frame = new JFrame("Name"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setBounds(200, 100, 500, 300); 
     Container cpane = frame.getContentPane(); 

     String[] labels = {"A", "B", "C", "D"}; 
     TextButtonPanel panel = new TextButtonPanel(labels); 
     cpane.add(panel); 

     frame.setVisible(true); 
    } 
} 



public class SwingProg { 
    private static void createAndShowGUI() { 
     new MyGui(); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
Смежные вопросы