我打算为最短路径构建一个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;iGUILayout
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 );这是面板需要添加到滚动窗格的视口,而不是直接添加到滚动窗格.
为什么要创建自定义布局管理器.您对布局管理器应如何工作的概念是错误的.您不应该在布局管理器中使用硬编码值.例如,如果您决定更改组件的字体,则需要更改所有计算.如果您需要添加其他组件,则计算将发生变化.您的布局管理器代码将成为维护的噩梦.
您应该使用布局管理器来简化工作.这可能意味着您需要使用嵌套面板,许多人使用不同的布局管理器.
说完所有你正在使用滚动窗格太复杂了.您无需创建水平和垂直滚动条,滚动窗格将为您管理.滚动窗格的用法应该类似于:
JScrollPane scrollPane = new JScrollPane( panel );
不:
JScrollPane scrollPane = new JScrollPane(); scrollPane.add( panel );
这是面板需要添加到滚动窗格的视口,而不是直接添加到滚动窗格.