动作侦听器不处理鼠标单击

 的撒旦 发布于 2023-02-08 16:32

我打算为最短路径构建一个GUI.我在for循环中创建了按钮.现在我想更改按下按钮的颜色,但是我收到有关动作侦听器的错误.它说"线程中的异常"主"java.lang.Error:未解决的编译问题:AbstractButton类型中的方法addActionListener(ActionListener)不适用于参数(Final_GUI)".虽然我已经使用JPanel测试了这段代码它在那里工作得很好,但在这里它现在不起作用.我想改变按下的按钮的颜色.如果再次按下该按钮,我想要恢复其先前的颜色.以下是我想做的事情: 在此输入图像描述.. :(

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

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);}
}
}

camickr.. 5

为什么要创建自定义布局管理器.您对布局管理器应如何工作的概念是错误的.您不应该在布局管理器中使用硬编码值.例如,如果您决定更改组件的字体,则需要更改所有计算.如果您需要添加其他组件,则计算将发生变化.您的布局管理器代码将成为维护的噩梦.

您应该使用布局管理器来简化工作.这可能意味着您需要使用嵌套面板,许多人使用不同的布局管理器.

说完所有你正在使用滚动窗格太复杂了.您无需创建水平和垂直滚动条,滚动窗格将为您管理.滚动窗格的用法应该类似于:

JScrollPane scrollPane = new JScrollPane( panel );

不:

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

这是面板需要添加到滚动窗格的视口,而不是直接添加到滚动窗格.

1 个回答
  • 为什么要创建自定义布局管理器.您对布局管理器应如何工作的概念是错误的.您不应该在布局管理器中使用硬编码值.例如,如果您决定更改组件的字体,则需要更改所有计算.如果您需要添加其他组件,则计算将发生变化.您的布局管理器代码将成为维护的噩梦.

    您应该使用布局管理器来简化工作.这可能意味着您需要使用嵌套面板,许多人使用不同的布局管理器.

    说完所有你正在使用滚动窗格太复杂了.您无需创建水平和垂直滚动条,滚动窗格将为您管理.滚动窗格的用法应该类似于:

    JScrollPane scrollPane = new JScrollPane( panel );
    

    不:

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

    这是面板需要添加到滚动窗格的视口,而不是直接添加到滚动窗格.

    2023-02-08 16:35 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有