单击时,JList值会更改

时间:2014-01-28 20:46:56

标签: java swing mouseevent jlist

论坛和Java新手。我试图让我的JList在双击时响应,我已经完成了。 JList由SQL查询填充,当按下GUI中的按钮时,该查询将运行。基于SQL查询,将填充JList,这也有效。

如果我尝试通过单击按钮再次查询SQL来更新JList,则会出现问题。当我单击它时,更改最初显示在JList中,但是当我在JList中单击该选项时,它会立即切换回最初的状态。当我双击看起来不正确的名称时,我在控制台中打印的值会正确报告。所以它在控制台中的值是正确的,但JList中的渲染是不正确的。

我感谢任何回复,我没有运气就梳理了论坛。我是Java的新手,所以我确信我的代码还有很多不完善的地方。代码如下,如果您需要更多,请告诉我。谢谢。

 public JPanel results(StringBuilder message)
{   
    StringBuilder[] options = {message};
    showOption = new JList(options);
    showOption.setLocation(300, 50);
    showOption.setSize(140,100);
    showOption.setVisibleRowCount(10);
    textPanel.add(showOption);
    showOption.revalidate();
    showOption.repaint();

    MouseListener mouseListener = new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
    //JList showOption = (JList) mouseEvent.getSource();

    if (e.getClickCount() == 2) {

    int index = showOption.locationToIndex(e.getPoint());
    Object o = showOption.getModel().getElementAt(index);
    System.out.println("Double-clicked on: " + o.toString());
    }
    }
    };

    showOption.addMouseListener(mouseListener);
    return totalGUI;
}
public static void main ( String args[] )
{
    //JFrame.setDefaultLookAndFeelDecorated(true);
    JFrame frame = new JFrame("[=] JTextField of Dreams [=]");

    GUI_TextField demo = new GUI_TextField();
    frame.setContentPane(demo.createContentPane());
    //frame.setContentPane(demo.results(message));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(510, 400);
    frame.setVisible(true);
}

1 个答案:

答案 0 :(得分:4)

有三件事立刻向我跳了出来。

  1. 您每次都在创建一个新的JList
  2. 您手动设置JList
  3. 的大小和位置
  4. 您没有删除之前的JList
  5. 例如......

    public JPanel results(StringBuilder message)
    {   
        StringBuilder[] options = {message};
        // Create new JList
        showOption = new JList(options);
        // This is ill advised
        showOption.setLocation(300, 50);
        showOption.setSize(140,100);
        showOption.setVisibleRowCount(10);
        // What about the last JList?
        textPanel.add(showOption);
    

    这提出了许多可能性,可能就是你覆盖了上一个列表,当textPanel经过验证和绘制时,它会被带到前面。

    随后(松散地)摆动MVC paradigm(和for more details

    因此,您不应每次都重新创建视图,而应简单地重新创建模型,例如......

     public JPanel results(StringBuilder message)
     {   
         DefaultListModel model = new DefaultListModel();
         model.addElement(message);
         showOption.setModel(model);
    

    如果在调用此方法之前未创建showOption,则应考虑使用if语句检测showOption何时null并正确初始化

    您还应该避免使用setLocationsetSize。 Swing旨在使用布局管理器进行操作,这使得可以定义可以跨多个平台使用的工作流和总体布局。

    查看How to use listsLaying Out Components Within a Container