不用这么复杂,让所有的JComboBox加一个ActionListener就行了。如果某些JComboBox处理的事和其它的不同,只要(ActionEvent e) e.getsource == ?(你所要处理特殊事件的控件名)。
这样,所有的JComboBox都响应同一个功能。
这样,所有的JComboBox都响应同一个功能。
解决方案 »
- java几个郁闷的考题
- exe
- 获取的json格式有问题啊!但是不知道具体哪个啊!有人人能看明白吗?
- 删除
- JAVA GUI的默认界面怎么这么丑啊,有没有什么方法可以让界面像WINDOWS一样啊???
- 问一个很有意思又很难的java问题,如果能回答出来估计真的是高高手了!
- ◆◆我想在JBuiler下建一个最简单的Java程序,在新建图标选择中,是选择Application?还是Project?◆◆
- 将String转换为Color的方法
- JAVA 为什么没有枚举类型???
- Javascript和Applet之间能进行交互吗?
- 包不见了怎么办?
- 为什么每个java程序都有public static void main(String args[])这句话,而有的就要在编译的时候加入参,有的就不需要呢?到底为什么啊?
虽然这样多建几个对象,我觉得思路很清晰,实现也简单
速度因改没什么影响
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]);
}
}
}
应该先删除 coms[i+1] 的所有项之后,再添加项!!coms[i+1].removeAllItems();
A->C->F->B
A->D->G->B
......我希望求出每一条选择的路径上花费的时间。所以我给出一组JComboBox第一个只能选择A,第二个可以选择C,D……,当第二个选择C的时候,第三个JComboBox列出的选项只能是D,F,不能出现G,同样,当第二个选择D的时候,第三个列表中不能出现D,F,只能出现G……第一个第二个JComboBox好说,第三个JComboBox以后,JComboBox里边出现的选项就要和前一个的选择有关了,就是这里让我很挠头。
举例来说,A.next={C,D};C.next={D,F};D.next={G,……}……
JComboBox里出现的选项就是他前面那个JComboBox所选字母的候选集。这样解决不知道行不行?
/*
* 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
}
如:对于节点A, getItems("A")将会得到一个items对象,表明items中含有D和C,这种逻辑是你自己定义的。
getItems("C")会得到items含有D,F4.当点击jcombox选中A时,下一个JComboBox就会调用setJcomboBoxContent(node.getItems("A")),同时把自己的items赋值成C,D 同理继续下去。关键在于动态的getItems()过程要你自己根据需要来写。怎样通过C只能得到D,F那是你的计算算法问题了:)
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,判断前面所有路径是否相同、、、
不知道我是否描述得清楚啊,呵呵,我只说一说我的思路,具体实现应该不难
A->C->D->E->B
A->C->F->B
A->D->G->B
A->F->D->E->B
......第一条与第四条,第四层的E父结点都是D
这里判断"前面所有路径"是否相同,因为可能存在这样的情况:
A->C->D->E->B
A->C->F->B
A->D->G->B
A->F->D->E->B
......第一条与第四条,第四层的E父结点都是D
http://expert.csdn.net/Expert/topic/2306/2306311.xml?temp=.3287775
先接一些分:)下面是我得程序,因为是第一次编这样的图形界面程序,肯定有不少冗余,错误,希望大家帮忙看看,一起研究研究。Node.javaimport 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;
}
}
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;
}
}
}
}
}
我建议你用另外的方式来替换你要实现的这个功能.
A->C->D->E->B
A->C->F->B
A->D->G->B就比如说上面的这个数据例子,当用户第一个选择了a之后,你怎么计算得到第二个就只能选择c,d呢?以此类推,只要你弄明白了这个,那么所有的问题都解决了!至于说jcombobox的事件监听之类的,我认为都不是问题!
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;
}}