是这样的,我有一个JTable,双击单元格后,后台创建一个DateWindow类,这个类会先弹出个JOptionPane输入文本,再弹出个写好的JFrame,也是输入几项文本,然后利用得到的输入数据创建一个DateText类实例,添加到JTable里去。但是每次都是先执行了添加DateText实例到JTable中,然后再弹出窗口输入的……怎么才能倒过来呢?

解决方案 »

  1.   


    您能具体给我讲讲么 我初学swing
      

  2.   

    你在双击单元格的时候调用了创建实例 debug下看看
      

  3.   

    这是我的代码  麻烦帮我看看……不太懂线程机制诶……:
    public DateWindow(){
    // content = JOptionPane.showInputDialog(null,content,"new Date",JOptionPane.OK_CANCEL_OPTION);
    }
    class Window implements Runnable{
    public Window(){
    detailed.setLayout(new GridLayout(6,2));
    detailed.setForeground(Color.BLUE);

    detailed.setSize(400, 230);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Dimension frameSize = detailed.getSize();
    if (frameSize.height > screenSize.height) {
    frameSize.height = screenSize.height;
    }
    if (frameSize.width > screenSize.width) {
    frameSize.width = screenSize.width;
    }
    detailed.setLocation((screenSize.width - frameSize.width) / 2,
    (screenSize.height - frameSize.height) / 2);

    detailed.setResizable(false);
    detailed.setVisible(true);

    detailed.add(titleL);
    detailed.add(titleT);
    titleL.setHorizontalAlignment(JLabel.CENTER); JPanel jtime = new JPanel();
    jtime.setLayout(new BoxLayout(jtime, BoxLayout.X_AXIS));
    detailed.add(time);
    time.setHorizontalAlignment(JLabel.CENTER);;
    jtime.add(yearT);
    jtime.add(yearL);
    jtime.add(monthT);
    jtime.add(monthL);
    jtime.add(dayT);
    jtime.add(dayL);
    jtime.add(hourT);
    jtime.add(hourL);
    detailed.add(jtime); detailed.add(duringTL);
    duringTL.setHorizontalAlignment(JLabel.CENTER);
    JPanel jduring = new JPanel();
    jduring.setLayout(new GridLayout());
    jduring.add(duringTT);
    jduring.add(duringB);
    detailed.add(jduring); detailed.add(locaL);
    locaL.setHorizontalAlignment(JLabel.CENTER);
    detailed.add(locaT); detailed.add(repeatL);
    repeatL.setHorizontalAlignment(JLabel.CENTER);
    detailed.add(repeatB);

    JPanel jadd = new JPanel();
    jadd.setLayout(new FlowLayout());
    jadd.add(new JLabel(""));
    jadd.add(jbAdd);
    detailed.add(jadd);
    JPanel jcan = new JPanel();
    jcan.setLayout(new FlowLayout());
    jcan.add(new JLabel(""));
    jcan.add(jbCancel);
    detailed.add(jcan);

    jbCancel.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
    detailed.setVisible(false);
    stop = "end";
    }
    });

    jbAdd.addActionListener( new ActionListener(){
    // public DateText dateDetailed;
    public void actionPerformed(ActionEvent e){
    DateWindow.dateDetailed.setTitle(titleT.getText());
    DateWindow.dateDetailed.setYear(Integer.valueOf(yearT.getText().trim()));
    DateWindow.dateDetailed.setMonth(Integer.valueOf(monthT.getText().trim())-1);
    DateWindow.dateDetailed.setDay(Integer.valueOf(dayT.getText().trim()));
    DateWindow.dateDetailed.setHour(Integer.valueOf(hourT.getText().trim()));
    int duringt = Integer.valueOf(duringTT.getText().trim());
    if(duringB.getSelectedItem()=="hour");
    else if(duringB.getSelectedItem()=="day")
    duringt = duringt*24;
    else if(duringB.getSelectedItem()=="week")
    duringt = duringt*24*7;
    else;
    DateWindow.dateDetailed.setDuringTime(duringt);
    DateWindow.dateDetailed.setLocation(locaT.getText());
    DateWindow.dateDetailed.setContent(contentT.getText());
    DateWindow.dateDetailed.setRepeat(repeatB.getSelectedIndex());

    stop = "end";

    detailed.setVisible(false);
    JOptionPane.showMessageDialog(null, "a new date has been added successful!");
    }
    });
    }
    public void run() {
    // TODO Auto-generated method stub
    while(true)
    if(stop.equals("end"))
    return;
    }
    }
    public DateText init(){
    Window mywindow = new Window();
    try{
    SwingUtilities.invokeAndWait(mywindow);

    }catch(Exception e){
    System.out.println(e);
    }
    return dateDetailed;
    }然后在外部的mouseClick里面是这么写的:
    if (e.getClickCount() == 2) {
    Point p = e.getPoint();
    int row = table.rowAtPoint(p);
    int column = table.columnAtPoint(p);

    content = JOptionPane.showInputDialog(null, content,
    "new Date", JOptionPane.OK_CANCEL_OPTION);
    if (content == null);
    else {
    DateWindow window = new DateWindow();
    DateText add = window.init();
    if(add == null );
    else
    weekModel.setValueAt(add, row, column);
    }
      

  4.   

    根本就不需要什么线程吧?取得showInputDialog的返回值再操作就是了,
    弹出dialog的时候事件是挂起的,输入完毕之后才会继续,不需要程序控制import java.awt.*;
    import java.awt.event.*;import javax.swing.*;
    import javax.swing.table.TableColumn;
    public class SwingTest extends JFrame{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public JPanel jp;
    public JTable jt;

    public SwingTest(){
    super("test");
    this.setFocusable(true);
    this.addWindowListener(new WindowListener());
    setLocation(200, 200);
    setVisible(true);
    init();
    pack();
    }

    public void init(){
    jp = new JPanel();
    jt = new JTable(3,1);
    jt.addMouseListener(new MyMouseListener());
    TableColumn firsetColumn = jt.getColumnModel().getColumn(0);
    firsetColumn.setPreferredWidth(150);
    jp.add(jt);
    getContentPane().add(jp);
    }

    public class MyMouseListener implements MouseListener{ @Override
    public void mouseClicked(MouseEvent e) {
    Point p = e.getPoint();
                int row = jt.rowAtPoint(p);
                int column = jt.columnAtPoint(p);
                
                String content = JOptionPane.showInputDialog(null, null,
                        "input as yyyyMMDD", JOptionPane.OK_CANCEL_OPTION);
                if(content!=null){
                 DateWindow window = new DateWindow();
                    DateText add = window.init(content);             jt.setValueAt(add, row, column);
                }
            }
    @Override
    public void mouseEntered(MouseEvent e) {
    }
    @Override
    public void mouseExited(MouseEvent e) {
    }
    @Override
    public void mousePressed(MouseEvent e) {
    }
    @Override
    public void mouseReleased(MouseEvent e) {
    }
    }

    public class DateWindow{
    DateText init(String content){
    return new DateText(content);
    }
    }

    public class DateText{
    String year = "";
    String month = "";
    String day = "";
    public DateText(String content){
    try{
    year = content.substring(0,4);
    month = content.substring(4,6);
    day = content.substring(6,8);
    }
    catch(Exception e){

    }
    }
    public String toString(){
    return year+"年"+month+"月"+day;
    }


    public class WindowListener extends WindowAdapter{
    public void windowClosing(WindowEvent e){
    System.exit(0);
    }
    }

    public static void main(String[] args){
    SwingTest gt = new SwingTest();
    }
    }