abendrobotor
发表于 2006-6-26 16:49
现在我的问题是这行句柄,添加array里所有的button的这个,这个有什么错误呢?
add(feld);
所有81个button都添加完了,我才能进行分配数字的下一步啊.谁能帮我啊,add();怎么用在array上啊?
greenflute
发表于 2006-6-26 17:22
这个要看你自己觉得怎么样合适了,一般而言,如图的排列,当然是整个作为一个panel,使用gridlayout比较好,但是这样的话,为了显示出9个小方块的区别,又要做一番显示上的代码处理。但是如果为了显示的方便使用9个小panel(也要使用gridlayout),那么就有两种按钮分配方式,一是每个panel分配数组中的一行/ 列,这样检查小方块比较方便,而为了检查每行每列必须满足不能重复的条件,为了不丧失使用数组的优势,就势必要有一点代码来将这81个按钮打破数组顺序分配给9个panel了。
所以觉得这样做,倒不如简单一些,声明一个81项的一维数组。这样在进行行列检查时也比较方便,行检查时对数组内一个范围检查,列检查时是对数组内以9为间隔的元素的检查。而在往小panel中添加时,也可以分别通过数组索引除9的整数和余数来确定行和列。
int row, col, rrow, ccol;
for (int i = 0; i < 81; i++) {
row = i / 9;
col = i % 9;
rrow = row / 3;
ccol = col / 3;
System.out.println(row + "\t" + col + "\t" + rrow + "\t" + ccol);
buttons = new JButton();
buttons.setText("" + i);
if (smallpanel == null) {
smallpanel = new JPanel(new GridLayout(3, 3));
smallpanel.setBorder(new LineBorder(Color.BLUE, 2));
largepanel.add(smallpanel);
}
smallpanel.add((buttons));
}
这样做是可以减少一部分校验代码的麻烦程度的。至于教授的tipp,
如果只是为了熟悉双循环大可不必,后面的多重循环多着呢:):)
关于你的代码的问题
1、panel和button都需要实例化的,生成一个数组并不能代替数组内元素的生成。
2、add方法要有施动者,不管是数组里的panel,还是主窗口,代码大致应该是这
个样子的,至于怎么放到循环里面,就看你愿意使用哪种循环了。
Button[][] feld = new Button;
Panel[] p = new Panel;
// new panel
p=new Panel();
// new Button
feld=new Button();
// add button
p.add(feld);
3、不管使用Swing还是AWT,使用多个组件时都要使用布局管理器的
abendrobotor
发表于 2006-6-29 10:36
Vielen dank für alle und eure Beiträge,ich habe davon sehr viel gelernt,besonders von greenflute.
Ich bin an der Uni,kann nur Deutsch schreiben.
Insofern bin ich so weit und habe das Programm geschrieben. Die weitere Aufgabe kommt am Freitag wieder.Ich werd dem verfolgen.
mein Programm lautet:
import java.awt.*;
public class Sudoku extends Frame
{
Button [][]feld = new Button;
Panel[] kleinePanel = new Panel;
int hori, vert,horiinPanel,vertinPanel;
int getButtonZahl;
public static void main (String[] args)
{
new Sudoku ();
}
public Sudoku()
{
setLayout(new GridLayout(3,3,3,3));
for (int p = 0; p < 9; p++) {
kleinePanel = new Panel(new GridLayout(3,3,1,1));
add(kleinePanel);
}
//set all the Buttons in 9 Panels
for (int y = 0; y < 9; y++) {
vert = (y / 3);
vertinPanel = (y % 3);
for (int x = 0; x < 9; x++) {
hori = (x / 3);
vertinPanel = (x % 3);
getButtonZahl++;
feld = new Button();
kleinePanel[(vert * 3) + hori].add(feld);
}
}
//setColor
Color HELLBLAU = new Color(127,127,255);
Color HELLGELB = new Color(255,255,127);
setBackground(HELLGELB);
for (int c = 0; c < 8; c++) {
if ((c % 2) == 0)
kleinePanel.setBackground(HELLBLAU);
else
kleinePanel.setBackground(HELLBLAU);
}
//setFont
Font f = new Font("SansSerif", Font.PLAIN, 30);
setFont(f);
setSize(458,458);
show();
}
}
greenflute
发表于 2006-6-29 11:16
不错不错;);)
abendrobotor
发表于 2006-6-29 13:25
原帖由 greenflute 于 2006-6-29 12:16 发表
不错不错;);)
谢谢支持啊,后边校验的程序我还没想出来呢,明天上完课后,让我这个周末想想.
abendrobotor
发表于 2006-7-3 23:28
乱了好几天,今天回来问问我周末出的个小问题.
我想在button上加数字,这个数字是变量中携带的.我所知道的语句是:
1,setText(String);
2,setLabel(String label)
这两个语句是不是都是在konstruktor里用的啊?怎么我用在后边的methode里就不行呢,说找不到symbol.
第一个语句是最长用的,greenflute里给的程序里也有个:buttons.setText("" + i); 如果不直接输入string,而是个变量,是不是一定要setText("" + i);这样写呢?怎么我这样照搬都不行,说identifier experted呢?
abendrobotor
发表于 2006-7-4 22:30
哎,坐电脑前2个半小时了,还是没有想出来如何安排预先固定的那些数.我是不是应该每个小panel都作成一个单独的对象呢,这样也比较容易生成数,直接用个方法随机出数,然后p.Erzeugen();,还是再弄一个循环,让他出数呢.
哎呀~我是晕了.我再想想.16层的问题也没有解决,后边还有校验的程序等着,估计作业要泡汤~
greenflute
发表于 2006-7-4 22:53
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
/**
* small cube panel
*/
public class SodukuPanel extends JPanel {
public SodukuPanel() {
super();
buttons = new ArrayList<SodukuTeil>();
}
public Component add(Component comp) {
//if (buttons.size() <= 9 && !buttons.contains(comp)) {
buttons.add((SodukuTeil) comp);
//}
return super.add(comp);
}
public ArrayList<SodukuTeil> getButtons() {
return buttons;
}
private ArrayList<SodukuTeil> buttons = null;
}
greenflute
发表于 2006-7-4 22:55
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
/**
* Suduku Button
*/
public class SodukuTeil extends JButton {
/**
* construct a new Button, specify its location in the panel
*
* @param row
* @param col
*/
public SodukuTeil(int row, int col) {
super();
this.row = row;
this.col = col;
}
public Integer getRow() {
return row;
}
public Integer getCol() {
return col;
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
if (value != null) {
this.setText(value.toString().trim());
}
}
/* row and col */
private Integer row = null, col = null;
/* value of this button */
private Integer value = null;
}
greenflute
发表于 2006-7-4 22:58
buttons = new SodukuTeil(row, col);
//buttons.setValue(i);
buttons.setText(" ");
smallpanel = new SodukuPanel();
SodukuTeil [] buttons = new SodukuTeil;
SodukuPanel [][] smallpanel = new SodukuPanel;