一个很急的图形界面编程的问题

haode 2003-09-26 12:05:18
在一个Frame上边,我放了两个Panel,在第一个Panel里边,有一组JComboBox。

现在的问题是,我需要根据前面JComboBox的值,来生成后边的JComboBox,比如说用户第一个JComboBox里边选择A,那么第二个JComboBox的选项就可以是B,C,D;如果用户第一个JComboBox里边选择B,那么第二个JComboBox的选项只能是C,D……

假如只有两个JComboBox的时候,我可以在第一个上边加一个ActionListener,来构造第二个JComboBox,但是现在有三个,四个,甚至更多的JComboBox,应该怎么办?

请大家帮忙出出主义,问题比较急。

thx
...全文
201 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
pxboy 2003-09-28
  • 打赏
  • 举报
回复
是不是可以了?
fpwang 2003-09-27
  • 打赏
  • 举报
回复
UP
haode 2003-09-27
  • 打赏
  • 举报
回复
MyTest.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.Vector;

class MyTest extends Frame{
static JComboBox menu1,menu2,menu3,menu4; //最长的路径是四步
static Vector nodes;

public MyTest() {
nodes = new Vector();
Node node = new Node();
nodes = node.init();


JPanel mainPanel = new JPanel();

menu1 = new JComboBox();
menu1.addItem("");
menu1.addItem("A");
menu1.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
menu1ActionPerformed(evt);
}
});

menu2 = new JComboBox();
menu2.addItem(" "); //这里好像必须要空一个格,否则生成的menu很难看
menu2.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
menu2ActionPerformed(evt);
}
});

……
以此类推,menu3,menu4
……

mainPanel.setLayout(new BoxLayout(mainPanel,BoxLayout.X_AXIS));
mainPanel.add(new JPanel());
mainPanel.add(menu1);
mainPanel.add(new JLabel("-->"));
mainPanel.add(menu2);
mainPanel.add(new JLabel("-->"));
mainPanel.add(menu3);
mainPanel.add(new JLabel("-->"));
mainPanel.add(menu4);
mainPanel.add(new JPanel());

add(mainPanel);

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

public static void main(String args[]) {
System.out.println("Starting MyTest...");
Cctcal mainFrame = new MyTest();
mainFrame.setSize(1000, 500);
mainFrame.setTitle("MyTest");
mainFrame.setVisible(true);
}

private void menu1ActionPerformed (java.awt.event.ActionEvent evt){
if(!((String)menu1.getSelectedItem()).equals("")){
for(int i=0;i<nodes.size();i++){
if((((Node)nodes.get(i)).getName()).equals((String)menu1.getSelectedItem())){
Node n = (Node)nodes.get(i);
menu2.removeAllItems();
menu2.addItem(" ");
int temp = n.getNNodeSize();
for(int j=0;j<temp;j++){
Vector nextNode = n.getAllNode();
int t = ((Integer)nextNode.get(j)).intValue();
menu2.addItem(((Node)nodes.get(t)).getName());
}
break;
}
}
}
}

private void menu2ActionPerformed (java.awt.event.ActionEvent evt){
if (!(menu2.getSelectedItem()==null)){
if(!((String)menu2.getSelectedItem()).equals(" ")){
for(int i=0;i<nodes.size();i++){
if((((Node)nodes.get(i)).getName()).equals((String)menu2.getSelectedItem())){
Node n = (Node)nodes.get(i);
menu3.removeAllItems();
menu3.addItem(" ");
int temp = n.getNNodeSize();
for(int j=0;j<temp;j++){
Vector nextNode = n.getAllNode();
int t = ((Integer)nextNode.get(j)).intValue();
menu3.addItem(((Node)nodes.get(t)).getName());
}
break;
}
}
}
}
}
haode 2003-09-27
  • 打赏
  • 举报
回复
这个问题基本上解决了,感谢 ngk2030(天箭)给我提供了一个思路,也感谢大家的参与。

请参与讨论的朋友去
http://expert.csdn.net/Expert/topic/2306/2306311.xml?temp=.3287775
先接一些分:)

下面是我得程序,因为是第一次编这样的图形界面程序,肯定有不少冗余,错误,希望大家帮忙看看,一起研究研究。

Node.java

import java.util.Vector;

public class Node{
private String name; //节点名称
private int nNum; //节点编号
private Vector nNode; //后续节点
……
set,get方法
……
public Vector init(){
Vector temp = new Vector();

Node node0 = new Node();
node0.setName("A");
node0.setNNum(0);
node0.nNode=new Vector();
node0.nNode.addElement(new Integer(1)); //C的num是1
node0.nNode.addElement(new Integer(2)); //D的num是2
node0.nNode.addElement(new Integer(3)); //E的num是3
node0.nNode.addElement(new Integer(4));
temp.add(node0);

……
把所有的节点都定义一遍
……

return temp;
}
}
pxboy 2003-09-27
  • 打赏
  • 举报
回复
上面错了,应该是这样说:
这里判断"前面所有路径"是否相同,因为可能存在这样的情况:
A->C->D->E->B
A->C->F->B
A->D->G->B
A->F->D->E->B
......

第一条与第四条,第四层的E父结点都是D
pxboy 2003-09-27
  • 打赏
  • 举报
回复
这里判断父结点是否相同,因为可能存在这样的情况:
A->C->D->E->B
A->C->F->B
A->D->G->B
A->F->D->E->B
......

第一条与第四条,第四层的E父结点都是D
pxboy 2003-09-27
  • 打赏
  • 举报
回复
我想我应该明白你的意思了,

A->C->D->E->B
A->C->F->B
A->D->G->B
......

从A开始,首先A存在:C、D,选C,出现D、F,选D,出现E,而不是E、G
我想,关键在于选D时不出现G,其实这时只要判断一下D前面的路径是否相同就行了,不知道我理解是否正确:)

我是方案是这样:
先保存所有节点在一个二维数组,选A时,从第二层取父节点为A的C、D,判断前面所有路径是否相同,选C时,从第三层取父结点为C的D、F,判断前面所有路径是否相同,选D时,从第四层取父结点为D的E,判断前面所有路径是否相同、、、
不知道我是否描述得清楚啊,呵呵,我只说一说我的思路,具体实现应该不难
pxboy 2003-09-27
  • 打赏
  • 举报
回复
我做了一个,看看是不是这样的:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.border.*;

public class Map
extends JFrame implements ItemListener
{

public JPanel jPanel;

String[][] nodes =
{
{"A", "C", "D", "E", "B"},
{"A", "C", "F", "B"},
{"A", "D", "G", "B"},
{"A", "F", "D", "E", "B"},
{"A", "D", "E", "G", "B"},
{"A", "E", "D", "C", "B"},
{"A", "C", "F", "G", "B"},
{"A", "F", "E", "C", "B"},
};
int rowCount = 8;
int colCount = 5;

JComboBox[] jComboBoxs;

public Map()
{
try
{
jbInit();
}
catch (Exception e)
{
e.printStackTrace();
}
}


public static void main(String[] args)
{
Map dragFrame = new Map();
dragFrame.setSize(600, 500);
dragFrame.setVisible(true);
}


private void jbInit() throws Exception
{

jPanel = new JPanel();
jPanel.setLayout(null);

jComboBoxs = new JComboBox[colCount];
int x = 20, y = 30;
for(int i=0; i<colCount; i++)
{
jComboBoxs[i] = new JComboBox();
//jComboBoxs[i].addItemListener(this);
jComboBoxs[i].setName(String.valueOf(i));
jComboBoxs[i].setVisible(false);
jComboBoxs[i].setBounds(x,y, 100, 25);
jPanel.add(jComboBoxs[i]);
y += 30;
}
jComboBoxs[0].addItem("start");
jComboBoxs[0].addItem("A");
jComboBoxs[0].setVisible(true);
for(int i=0; i<colCount; i++)
{
jComboBoxs[i].addItemListener(this);
}


//System.out.println("row" + 1 + " length:" + nodes[1].length);

this.addWindowListener(new java.awt.event.WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
this_windowClosing(e);
}
});

JScrollPane jScrollPane1 = new JScrollPane();
this.setTitle("Map");
jScrollPane1.getViewport().add(jPanel);
this.getContentPane().add(jScrollPane1);
}


private void this_windowClosing(WindowEvent e)
{
System.exit(0);
}

public void itemStateChanged(ItemEvent e)
{
JComboBox current = (JComboBox)e.getSource();
String node = (String)current.getSelectedItem();

if(node == null)
return;

//当前选择的是第几层
int col = Integer.parseInt((current).getName());

int nextCol = col + 1;

if(nextCol >= this.colCount)
return;

//重新选择将后面的JComboBox隐藏
for(int i = 0; i< jComboBoxs.length; i++)
{
if(i > col)
{
jComboBoxs[i].setVisible(false);
jComboBoxs[i].removeAllItems();
jComboBoxs[i].addItem("");
}
}

//判断是否到终点
if(node.equals("B"))
{
return;
}

jComboBoxs[nextCol].setVisible(true);
resetComboBox(nextCol);

}

private void resetComboBox(int nextCol)
{
jComboBoxs[nextCol].removeAllItems();
jComboBoxs[nextCol].addItem("");
String currentNode = "";

for(int row=0; row<rowCount; row++)
{
if(nextCol >= nodes[row].length)
continue;

currentNode = nodes[row][nextCol];

//是否已经在JComboBox中存在选项value
if(aleadyAdd(jComboBoxs[nextCol],currentNode))
continue;

//判断父路径是否与当前路径相同
if(!isPathEqual(row, nextCol))
continue;

jComboBoxs[nextCol].addItem(currentNode);
}
}

private boolean aleadyAdd(JComboBox jComboBox, String value)
{
for(int i = 0; i< jComboBox.getItemCount(); i++)
{
if(jComboBox.getItemAt(i).equals(value))
return true;
}
return false;
}

private boolean isPathEqual(int row, int nextCol)
{
if(nodes[row].length <nextCol)
return false;

JComboBox currentJComboBox = null;
String currentNode = "";
for (int i = 0; i < nextCol; i++)
{
currentNode = nodes[row][i];
currentJComboBox = this.jComboBoxs[i];
if (!currentNode.equals(currentJComboBox.getSelectedItem()))
return false;
}
return true;
}

}


haode 2003-09-27
  • 打赏
  • 举报
回复
to Afritxia(Leaocom) 是的,我一开始的时候试图采用JList,但是比较了一下以后,我觉得JComboBox好像更加符合要求。我这是第一次做图形界面编程的东西,对Java的图形组件还不是很熟,如果你觉得有其他的组件放在这里更合适的话,咱们可以探讨一下:)

to zhang21cnboy(事了抚衣去,不留身与名),如何得到JComboBox中的显示数据我觉得还是比较简单的。我在构造Node类的时候,在里边放了一个Vector,这个Vector就是存放该节点后续节点的编号。我的思路是这样的:第一个JComboBox上用户选择A以后(A是起始点,必须选),通过menu1.getSelectedItem()方法,得到选项值str,然后从nodes这个集合中选取name属性为str的那个node,然后从这个node中,调用getAllNode方法,返回存有该node后续节点编号的Vector,从这个Vector里边一个一个的取出后续节点的编号,然后把对应编号的node挑出来,用他们的name字段来构造下一个JComboBox
zhang21cnboy 2003-09-27
  • 打赏
  • 举报
回复
我的看法:

你的这个问题,我认为最麻烦,最难,最有价值的部分是:你采用何种数据结构去描述的问题,还有就是在你的数据结构上你怎么实现的问题!

我认为,你首先需要弄明白的并不是说怎么在jcombobox里面显示东西,而是弄清楚怎么得到jcombobox里面应该显示的数据!


A->C->D->E->B
A->C->F->B
A->D->G->B

就比如说上面的这个数据例子,当用户第一个选择了a之后,你怎么计算得到第二个就只能选择c,d呢?以此类推,只要你弄明白了这个,那么所有的问题都解决了!

至于说jcombobox的事件监听之类的,我认为都不是问题!
Afritxia 2003-09-27
  • 打赏
  • 举报
回复
想问题不要太死板,你这样构造JComboBox组是很复杂的.
我建议你用另外的方式来替换你要实现的这个功能.
onefox 2003-09-26
  • 打赏
  • 举报
回复
标记先, 我去做个例子
ngk2030 2003-09-26
  • 打赏
  • 举报
回复
factory模式,好像有道理先查查书先
chandler 2003-09-26
  • 打赏
  • 举报
回复
1.应用factory模式

2.创建方法setJcomboBoxContent(Items items);

3.对于每个路线得节点都有一个getItems(nodname)方法,其方法确定了他的子item的内容。
如:对于节点A, getItems("A")将会得到一个items对象,表明items中含有D和C,这种逻辑是你自己定义的。
getItems("C")会得到items含有D,F

4.当点击jcombox选中A时,下一个JComboBox就会调用setJcomboBoxContent(node.getItems("A")),同时把自己的items赋值成C,D 同理继续下去。

关键在于动态的getItems()过程要你自己根据需要来写。怎样通过C只能得到D,F那是你的计算算法问题了:)
ngk2030 2003-09-26
  • 打赏
  • 举报
回复
我想再多的combox以此类推,反正是越到后面就越少,不过还有一些问题要考虑,如选择的顺序问题,第一个选A的问题等等,只有各位运行完上面的代码后才知道,不过如果第一个不选A那么就符合楼主的要求
ngk2030 2003-09-26
  • 打赏
  • 举报
回复
看我刚完成50%的代码,先申明第一个comboxbox一定要选A以外的其它的值,嘿嘿不然有问题正在弄,大家一块来想想就一定OK

代码块:
/*
* Test.java
*
* Created on 2003年9月26日, 下午4:11
*/
import javax.swing.*;
import java.util.*;
/**
*
* @author sky
*/
public class Test extends javax.swing.JFrame
{
private Hashtable h = null;
/** Creates new form Test */
public Test ()
{
h = new Hashtable(4);
initComponents ();
h.put ("cb1", cb1);
h.put ("cb2", cb2);
h.put ("cb3", cb3);
h.put ("cb4", cb4);
}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents()
{
cb1 = new javax.swing.JComboBox();
cb2 = new javax.swing.JComboBox();
cb3 = new javax.swing.JComboBox();
cb4 = new javax.swing.JComboBox();

getContentPane().setLayout(null);

addWindowListener(new java.awt.event.WindowAdapter()
{
public void windowClosing(java.awt.event.WindowEvent evt)
{
exitForm(evt);
}
});

cb1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "A", "B", "C", "D" }));
cb1.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
cb1ActionPerformed(evt);
}
});

getContentPane().add(cb1);
cb1.setBounds(30, 30, 190, 27);

cb2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "A", "B", "C", "D" }));
cb2.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
cb2ActionPerformed(evt);
}
});

getContentPane().add(cb2);
cb2.setBounds(30, 60, 190, 25);

cb3.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "A", "B", "C", "D" }));
cb3.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
cb3ActionPerformed(evt);
}
});

getContentPane().add(cb3);
cb3.setBounds(30, 90, 190, 25);

cb4.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "A", "B", "C", "D" }));
cb4.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
cb4ActionPerformed(evt);
}
});

getContentPane().add(cb4);
cb4.setBounds(30, 120, 190, 25);

pack();
}

private void cb4ActionPerformed (java.awt.event.ActionEvent evt)
{
DefaultComboBoxModel c3 = (DefaultComboBoxModel)cb3.getModel ();
c3.removeElement (cb4.getSelectedItem ());
}

private void cb3ActionPerformed (java.awt.event.ActionEvent evt)
{
DefaultComboBoxModel c4 = (DefaultComboBoxModel)cb4.getModel ();
c4.removeElement (cb3.getSelectedItem ());
}

private void cb2ActionPerformed (java.awt.event.ActionEvent evt)
{
DefaultComboBoxModel c3 = (DefaultComboBoxModel)cb3.getModel ();
DefaultComboBoxModel c4 = (DefaultComboBoxModel)cb4.getModel ();
c3.removeElement (cb2.getSelectedItem ());
c4.removeElement (cb2.getSelectedItem ());
}

private void cb1ActionPerformed (java.awt.event.ActionEvent evt)
{
DefaultComboBoxModel c2 = (DefaultComboBoxModel)cb2.getModel ();
DefaultComboBoxModel c3 = (DefaultComboBoxModel)cb3.getModel ();
DefaultComboBoxModel c4 = (DefaultComboBoxModel)cb4.getModel ();
c2.removeElement (cb1.getSelectedItem ());
c3.removeElement (cb1.getSelectedItem ());
c4.removeElement (cb1.getSelectedItem ());
}

/** Exit the Application */
private void exitForm (java.awt.event.WindowEvent evt)
{
System.exit (0);
}

/**
* @param args the command line arguments
*/
public static void main (String args[])
{
new Test ().show ();
}


// Variables declaration - do not modify
private javax.swing.JComboBox cb1;
private javax.swing.JComboBox cb2;
private javax.swing.JComboBox cb3;
private javax.swing.JComboBox cb4;
// End of variables declaration

}
yangFrame 2003-09-26
  • 打赏
  • 举报
回复
每个字母都有一组候选值。
举例来说,A.next={C,D};C.next={D,F};D.next={G,……}……
JComboBox里出现的选项就是他前面那个JComboBox所选字母的候选集。

这样解决不知道行不行?
haode 2003-09-26
  • 打赏
  • 举报
回复
可能是我没有说清楚,上面几位高手似乎都没有说到点子上。

其实我编的这个小程序,相当于一个图的遍历。举例说一下:

假设有两地A,B,中间有很多条路

可以有下列路径选择:

A->C->D->E->B
A->C->F->B
A->D->G->B
......

我希望求出每一条选择的路径上花费的时间。所以我给出一组JComboBox

第一个只能选择A,第二个可以选择C,D……,当第二个选择C的时候,第三个JComboBox列出的选项只能是D,F,不能出现G,同样,当第二个选择D的时候,第三个列表中不能出现D,F,只能出现G……

第一个第二个JComboBox好说,第三个JComboBox以后,JComboBox里边出现的选项就要和前一个的选择有关了,就是这里让我很挠头。

hesi726 2003-09-26
  • 打赏
  • 举报
回复
哦!!代码有点问题!!
应该先删除 coms[i+1] 的所有项之后,再添加项!!

coms[i+1].removeAllItems();
hesi726 2003-09-26
  • 打赏
  • 举报
回复
我来试试啊!!
String[] values = new String[]{"A","B","C","D","E","F"};
JComboBox combox1 = new JComboBox(values);
JComboBox combox2 = new JComboBox();
......
JComboBox[] coms = new JComboBox[]{ combox1,combox2,combox3,combox4,combox5 };

for (int k=0;i<coms.length;k++)
{
coms[k].addActionListener(this);
}


public actionPerformed(ActionEvent e)
{
Obj aa = e.getSource();
int i=0;
for (;i<coms.length-1;i++)
if (aa==coms[i]) break;
if (i<coms.length)
{
Obj selvalue = coms[i].getSelectedItem();
if (selvalue!=null)
{
int j=0;
for (;j<values.length;j++)
if (selvalue.equals(values[j]) break;
for (;j<values.length;j++)
coms[i+1].addItem(values[j+1]);
}
}
}
加载更多回复(7)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧