2014-01-28 48 views
0

论坛和Java的新功能。我试图让我的JList在双击时作出响应,这是我完成的。 JList正在通过按下GUI中的按钮时运行的SQL查询填充。基于SQL查询,JList被填充,这也起作用。单击时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); 
} 

回答

4

立即有三件事情跳到我身上。

  1. 你正在创建一个新的JList每次
  2. 你手动设置的JList
  3. 的大小和位置,你不删除以前JList

例如。 ...

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

+0

谢谢!你的信息帮我解决了这个问题。我很欣赏这个例子和链接。我刚开始使用Java,这有很大帮助。再次感谢。 – robe0709

+0

很高兴帮助;) – MadProgrammer