2013-12-22 6 views
1

Я планирую создать графический интерфейс для кратчайшего пути. Я создал кнопки в цикле for. Теперь я хочу изменить цвета нажатых кнопок, но я получаю сообщение об ошибке «Слушатель событий». В нем говорится «Исключение в потоке» main «java.lang.Error: проблема неразрешенной компиляции: Метод addActionListener (ActionListener) в типе AbstractButton не применим для аргументов (Final_GUI)». Хотя я протестировал этот код, используя JPanel, и там там отлично работает, Но здесь он сейчас не работает. Я хочу изменить цвет нажатой кнопки. Если снова нажмите эту кнопку, я хочу, чтобы ее предыдущий цвет был восстановлен. Ниже картина того, что я хочу сделать: enter image description here .. :(Action Listener не работает с щелчками мыши

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JComboBox; 
import javax.swing.event.*; 
import javax.swing.JFrame; 

public class Final_GUI extends JFrame { 
JLabel label; 
ButtonGroup cbg; 
JRadioButton radio_1; 
JRadioButton radio_2; 
JRadioButton radio_3; 
JCheckBox checkbox_1; 
JCheckBox checkbox_2; 
JCheckBox checkbox_3; 
JScrollPane scrollpane_1; 
JComboBox combobox_1; 
JList list_1; 
JScrollPane sp_list_1; 
JComboBox combobox_2; 
JButton Orange; 
JButton Exit; 
JLabel for_text; 

int check [][]= new int [100][100]; 
int x=100; 
int y=200; 
JFrame frame = new JFrame(); 
    JButton[][] buttons = new JButton[x][y]; 
    JPanel mPanel = new JPanel(); 
    JPanel bPanel = new JPanel(); 
    JPanel cPanel = new JPanel(); 
    JTextArea scoreKeeper = new JTextArea(); 
    Container c = getContentPane(); 
    int[][] intArray = new int[x][y]; 

public Final_GUI() { 

    butGen(); 
     score(); 


    Final_GUILayout customLayout = new Final_GUILayout(); 

    getContentPane().setFont(new Font("Helvetica", Font.PLAIN, 12)); 
    getContentPane().setLayout(customLayout); 

    label = new JLabel("Shortest Path Finding Algorithm"); 
    getContentPane().add(label); 

    cbg = new ButtonGroup(); 
    radio_1 = new JRadioButton("radio_1", false); 
    cbg.add(radio_1); 
    getContentPane().add(radio_1); 

    radio_2 = new JRadioButton("radio_2", false); 
    cbg.add(radio_2); 
    getContentPane().add(radio_2); 

    radio_3 = new JRadioButton("radio_3", false); 
    cbg.add(radio_3); 
    getContentPane().add(radio_3); 

    checkbox_1 = new JCheckBox("checkbox_1"); 
    getContentPane().add(checkbox_1); 

    checkbox_2 = new JCheckBox("checkbox_2"); 
    getContentPane().add(checkbox_2); 

    checkbox_3 = new JCheckBox("checkbox_3"); 
    getContentPane().add(checkbox_3); 


    bPanel.setLayout(new GridLayout(x,y)); 

    mPanel.setLayout(new BorderLayout()); 

    mPanel.add(bPanel, BorderLayout.CENTER); 

    scrollpane_1 = new JScrollPane(mPanel); 



    scrollpane_1.setViewportView(mPanel); 
    getContentPane().add(scrollpane_1); 

    combobox_1 = new JComboBox(); 
    combobox_1.addItem("Size1"); 
    combobox_1.addItem("Size2"); 
    getContentPane().add(combobox_1); 

    DefaultListModel listModel_list_1 = new DefaultListModel(); 
    listModel_list_1.addElement("Black"); 
    listModel_list_1.addElement("Green"); 
    list_1 = new JList(listModel_list_1); 
    sp_list_1 = new JScrollPane(list_1); 
    getContentPane().add(sp_list_1); 

    combobox_2 = new JComboBox(); 
    combobox_2.addItem("Additional Data"); 
    combobox_2.addItem("Additional Data2"); 
    getContentPane().add(combobox_2); 

    Orange = new JButton("Orange"); 
    getContentPane().add(Orange); 

    Exit = new JButton("Exit"); 
    getContentPane().add(Exit); 

    for_text = new JLabel("Just For some text"); 
    getContentPane().add(for_text); 

    setSize(getPreferredSize()); 

    addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
      System.exit(0); 
     } 
    }); 
} 

private void butGen() 
{ 
    for(int i=0;i<x;i++) 
     for(int j=0;j<y;j++) 
     { 
      buttons[i][j] = new JButton(String.valueOf(i)+"x"+String.valueOf(j)); 
      buttons[i][j].setActionCommand("button" +i +"_" +j); 
      buttons[i][j].addActionListener(this); 

      buttons[i][j].setBackground(Color.GRAY); 
      buttons[i][j].setSize(100, 100); 
      bPanel.add(buttons[i][j]); 
     } 
} 

public void actionPerformed(ActionEvent e) 
{ 

    if(e.getActionCommand().contains("button")) 
    { 

     String str = e.getActionCommand().replaceAll("button", ""); 
     System.out.println(str); 
     String[] v = str.split("_"); 
     int i = Integer.parseInt(v[0]); 
     int j = Integer.parseInt(v[1]); 

     intArray[i][j]++; 

     if(check[i][j]!=1){ 
      buttons[i][j].setBackground(Color.BLUE); 
      check[i][j]=1; 
     } 
     else{ 
      buttons[i][j].setBackground(null); 
      check[i][j]=0; 
     } 


    System.out.println(e.getActionCommand() +" " +i +" " +j); 

    score(); 
} 
    } 
private void score() 
{ 
    for(int i=0;i<x;i++) 
     for(int j=0;j<y;j++) 
    buttons[i][j].setText(""); 

    } 

public static void main(String args[]) { 
    Final_GUI window = new Final_GUI(); 

    window.setTitle("SHORTEST PATH FINDING ALGORITHM"); 
    window.pack(); 
    window.show(); 
} 
} 

GUILayout

class Final_GUILayout implements LayoutManager { 

public Final_GUILayout() { 
} 

public void addLayoutComponent(String name, Component comp) { 
} 

public void removeLayoutComponent(Component comp) { 
} 

public Dimension preferredLayoutSize(Container parent) { 
    Dimension dim = new Dimension(0, 0); 

    Insets insets = parent.getInsets(); 
    dim.width = 1053 + insets.left + insets.right; 
    dim.height = 621 + insets.top + insets.bottom; 

    return dim; 
} 

public Dimension minimumLayoutSize(Container parent) { 
    Dimension dim = new Dimension(0, 0); 
    return dim; 
} 

public void layoutContainer(Container parent) { 
    Insets insets = parent.getInsets(); 

    Component c; 
    c = parent.getComponent(0); 
    if (c.isVisible()) {c.setBounds(insets.left+368,insets.top+24,304,64);} 
    c = parent.getComponent(1); 
    if (c.isVisible()) {c.setBounds(insets.left+8,insets.top+120,72,24);} 
    c = parent.getComponent(2); 
    if (c.isVisible()) {c.setBounds(insets.left+8,insets.top+144,72,24);} 
    c = parent.getComponent(3); 
    if (c.isVisible()) {c.setBounds(insets.left+8,insets.top+168,72,24);} 
    c = parent.getComponent(4); 
    if (c.isVisible()) {c.setBounds(insets.left+88,insets.top+120,72,24);} 
    c = parent.getComponent(5); 
    if (c.isVisible()) {c.setBounds(insets.left+88,insets.top+144,72,24);} 
    c = parent.getComponent(6); 
    if (c.isVisible()) {c.setBounds(insets.left+88,insets.top+168,72,24);} 
    c = parent.getComponent(7); 
    if (c.isVisible()) {c.setBounds(insets.left+168,insets.top+120,704,488);} 
    c = parent.getComponent(8); 
    if (c.isVisible()) {c.setBounds(insets.left+880,insets.top+120,160,160);} 
    c = parent.getComponent(9); 
    if (c.isVisible()) {c.setBounds(insets.left+24,insets.top+232,128,216);} 
    c = parent.getComponent(10); 
    if (c.isVisible()) {c.setBounds(insets.left+880,insets.top+296,160,216);} 
    c = parent.getComponent(11); 
    if (c.isVisible()) {c.setBounds(insets.left+904,insets.top+528,112,24);} 
    c = parent.getComponent(12); 
    if (c.isVisible()) {c.setBounds(insets.left+888,insets.top+568,144,32);} 
    c = parent.getComponent(13); 
    if (c.isVisible()) {c.setBounds(insets.left+16,insets.top+472,120,48);} 
} 
} 

ответ

5

Почему вы создаете пользовательский Layout Manager Вы концепцию того, как макет. менеджер должен работать неправильно. Вы не должны использовать жестко закодированные значения в своем менеджере компоновки. Например, если вы когда-либо решили изменить шрифт компонентов, все ваши вычисления нужно будет изменить. Если вам когда-либо понадобится добавить другой компонент, расчеты изменение. Ваш код менеджера макетов будет кошмаром для обслуживания.

Вместо этого вы должны использовать менеджеров компоновки, чтобы облегчить вашу работу. Это может означать, что вам нужно использовать вложенные панели, многие из которых используют разные менеджеры макетов.

Сказав все, что вы делаете использование прокрутки слишком сложным. Вам не нужно создавать горизонтальные и вертикальные полосы прокрутки, прокрутка поможет вам. Использование в ScrollPane должно быть что-то вроде:

JScrollPane scrollPane = new JScrollPane(panel); 

нет:

JScrollPane scrollPane = new JScrollPane(); 
scrollPane.add(panel); 

, который панель должна быть добавлена ​​к иллюминатору в ScrollPane, а не к ScrollPane непосредственно.

+0

Спасибо. Он работает сейчас. Теперь я столкнулся с другой проблемой. Экшен-прослушиватель не работает над щелчками мыши. В нем говорится «Исключение в потоке» main «java.lang.Error: проблема неразрешенной компиляции: \t Метод addActionListener (ActionListener) в типе AbstractButton не применим для аргументов (Final_GUI)» – waleeds37

+0

Я бы предположил, что для класса Final_GUI необходимо реализовать ActionListener. Кстати, вы используете «_» в имени класса? Можете ли вы показать мне какой-либо класс в JDK, который использует это в имени класса. Следуйте существующим стандартам и не создавайте свои собственные! – camickr

+0

Еще раз спасибо за вашу помощь. Я не знаю, что я делаю эти глупые ошибки несколько раз. В любом случае спасибо за ваше предложение. С этого момента я буду следовать стандартам. Кстати, я обычно не использую «_» в имени класса. Это было просто для моей легкости. Неважно . Оставайтесь Блаженными. Хорошего дня. :-) – waleeds37

Смежные вопросы