论坛和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);
}
答案 0 :(得分:4)
有三件事立刻向我跳了出来。
JList
JList
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
并正确初始化
您还应该避免使用setLocation
和setSize
。 Swing旨在使用布局管理器进行操作,这使得可以定义可以跨多个平台使用的工作流和总体布局。