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