我正在编写一个代码,它将一个单词(棋盘游戏的名称)或一个字母作为输入,并在我的数据库中搜索它。
如果有任何条目我会在表格中显示,否则我不想显示空表格,我想要显示标签"没有找到结果"它在1500ms后消失。
if语句正常工作。例如,如果我写'' t'我将以#t;'开头的所有游戏开始。在桌子上。
else语句有时会出现问题:
我做错了什么?谢谢!
点击按钮"搜索":
后的代码btnCerca.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
/*Connect to DB:*/
Database db = new Database();
Connection connection = null;
try
{
connection = db.connectToDB();
}
catch (SQLException ex)
{
ex.printStackTrace();
}
/*Create a query which search in the DB the word/letter entered by the user*/
Query query = new Query (connection);
query.search(textField.getText()); //execute the query
/*Get results:*/
ResultSet rs = query.getResults();
/* check if rs is empty */
boolean res = false;
try
{
res = rs.isBeforeFirst();
}
catch (SQLException e1)
{
e1.printStackTrace();
}
ListTableModel model = null;
JScrollPane scrollPane = new JScrollPane();
if (res) //there is something in rs
{
try
{
model = ListTableModel.createModelFromResultSet(rs);
}
catch (SQLException e1)
{
e1.getMessage();
}
/*The table which will show the results*/
JTable table_1 = new JTable(model);
scrollPane.setBounds(10, 75, 1200, 300);
panelRicerca.add(scrollPane);
scrollPane.setViewportView(table_1);
}
else //rs is empty
{
JLabel lblNoGiochi = new JLabel("No results found.");
lblNoGiochi.setBounds(448, 30, 400, 14);
panelRicerca.add(lblNoGiochi);
panelRicerca.repaint();
/*...I want the label disappear after 1500ms:*/
int delay = 1500;
ActionListener taskPerformer = new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
panelRicerca.remove(lblNoGiochi);
panelRicerca.repaint();
}
};
new Timer(delay, taskPerformer).start();
}
}
});
------------------------的修改 --------------- ---------
我做了一个更简单的例子,受同样的问题影响,所以你可以更快地编译和检查。
如果我写'#34;你好"我想要显示一张桌子。 如果我写任何其他内容,我希望表格显示标签。
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JLabel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class Test {
private JFrame frame;
private JTextField textField;
private JTable table;
private JLabel lbl;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Test window = new Test();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Test() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
lbl = new JLabel("Hey");
lbl.setBounds(378, 236, 46, 14);
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
textField = new JTextField();
textField.setBounds(102, 48, 86, 20);
frame.getContentPane().add(textField);
textField.setColumns(10);
JButton btnOk = new JButton("ok");
btnOk.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(20, 20, 50, 50);
table = new JTable();
if (textField.getText().equals("hello"))
{
System.out.println("I'm in the if statement");
//show the table:
frame.getContentPane().add(scrollPane);
scrollPane.setViewportView(table);
}
else
{
System.out.println("I'm in the else statement");
//don't show the table:
scrollPane.remove(table);
/* Already tried to use:
- revalidate and repaint the scrollPane
- revalidate and repaint the contentPane
- remove the entire scrollPane from the ContentPane
- remove the table from the scrollPane, then remove the scrollPane from the ContentPane
*/
//and show a label instead:
frame.getContentPane().add(lbl);
frame.getContentPane().repaint();
}
}
});
btnOk.setBounds(211, 47, 89, 23);
frame.getContentPane().add(btnOk);
}
}
答案 0 :(得分:1)
您将表格添加到面板:
panelRicerca.add(scrollPane);
稍后您将标签添加到面板:
panelRicerca.add(lblNoGiochi);
您无法从面板中删除表格窗格,因此将始终显示该窗格。
您需要:
CardLayout
。 CardLayout
允许您在同一面板中交换组件,因此只能看到一个组件。有关详细信息,请阅读How to Use CardLayout上的Swing教程。编辑:
在我原来的答案中,我建议您需要从面板中删除该表。实际上我的意思是"滚动窗格"因为你永远不会把表添加到面板。请注意我发布的代码显示添加"滚动窗格"到小组。你打算做相反的事情。
在原始代码中,您在同一面板中添加和删除了标签。我的建议是在同一个面板中添加/删除滚动窗格。
同样的概念,您可以从滚动窗格中删除该表。但是,再次将表格添加到"视口"滚动窗格。因此,如果你想删除它,你会做相反的事情。您可以使用setViewportView(null)
将其从滚动窗格的视口中删除。这不会从面板中移除滚动窗格(这仍然是最简单的解决方案),但表格不会显示在滚动窗格中。
但是,上述建议都不适用于您的演示代码,因为您在MouseListener中继续创建新的JScrollPane,因此您不必引用添加到框架中的滚动窗格。因此,滚动窗格变量必须是实例变量,并在构造函数中创建滚动窗格。
另外,不要使用null布局。 Swing旨在与布局管理器一起使用。因此,动态布局更改时的基本代码是:
panel.remove(...);
panel.add(...);
panel.revalidate(); // to invoke layout manager
panel.repaint(); // repaint changes.
所以我试图给出的基本答案是,如果你想要"删除"某些东西,你需要做的就是你将组件添加到框架中所做的相反。