[英]JTable gets displayed only once for search query in JFrame
因此,在为控件提供布局后,我发现我的表似乎没有显示。 标签(l1),组合框和提交按钮以我期望的方式显示,即使控制台消息也可以正常工作。 只是搜索后应该出现的Jtable不会显示。
错误可能出在哪里,应如何纠正。 这是我的代码:
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.sql.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class r_search_2 extends JFrame implements ActionListener {
JFrame frame1;
JLabel l0, l1, l2;
JComboBox c1;
JButton b1;
Connection con;
ResultSet rs, rs1;
Statement st, st1;
PreparedStatement pst;
String ids;
static JTable table = new JTable();;
String[] columnNames = {"SECTION NAME", "REPORT NAME", "CONTACT", "LINK"};
String from;
Vector v = new Vector();
JMenuBar menu = new JMenuBar();
JPanel mainPanel = new JPanel(new BorderLayout());
JPanel topPanel = new JPanel(new FlowLayout(SwingConstants.LEADING, 60,25));
r_search_2()
{
b1 = new JButton("submit");
//l0.setBounds(100, 50, 350, 40);
l1.setBounds(75, 110, 75, 20);
b1.setBounds(150, 150, 150, 20);
b1.addActionListener(this);
topPanel.add(l1);
try
{
File dbFile = new File("executive_db.accdb");
String path = dbFile.getAbsolutePath();
con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ= " + path);
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
st = con.createStatement();
rs = st.executeQuery("select index_name from Index1");
while (rs.next())
{
ids = rs.getString(1);
v.add(ids);
}
c1 = new JComboBox(v);
c1.setEditable(true);c1.setSelectedItem("");
c1.setBounds(150, 110, 150, 20);
topPanel.add(c1);
topPanel.add(b1);
mainPanel.add(topPanel, BorderLayout.PAGE_START);
st.close();
rs.close();
} catch (Exception e) {
}
// setVisible(true);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == b1) {
showTableData();
}
}
public void showTableData()
{
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(columnNames);
table.setModel(model);
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
table.setFillsViewportHeight(true);
JScrollPane scroll = new JScrollPane(table);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
from = (String) c1.getSelectedItem();
String section_name = "";
String report_name = "";
String contact_name = "";
String link = "";
try
{
pst = con.prepareStatement("select distinct Section.Section_Name,Report.Report_Name,Report.Link,Contact.Contact_Name "
+ "FROM (( Section INNER JOIN Report ON Report.Section_ID=Section.Section_ID ) INNER JOIN Contact ON Contact.Contact_ID=Report.Contact_ID ) LEFT JOIN Metrics ON Metrics.Report_ID=Report.Report_ID "
+ " WHERE Section.Section_Name LIKE '%"+from+"%' OR Report.Report_Name LIKE '%"+from+"%' OR Metrics.Metric_Name LIKE '%"+from+"%' OR Contact.Contact_Name LIKE '%"+from+"%' ");
ResultSet rs = pst.executeQuery();
int i = 0;
while (rs.next()) {
section_name = rs.getString("Section_Name");
report_name = rs.getString("Report_Name");
contact_name = rs.getString("Contact_Name");
link = rs.getString("Link");
model.addRow(new Object[]{section_name, report_name, contact_name, link});
i++;
}
if (i < 1) {
JOptionPane.showMessageDialog(null, "No Record Found", "Error", JOptionPane.ERROR_MESSAGE);
}
if (i == 1) {
System.out.println(i + " Record Found");
} else {
System.out.println(i + " Records Found");
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
mainPanel.add(scroll);
mainPanel.revalidate();
mainPanel.repaint();
}
public static void main(String args[]) {
r_search_2 s=new r_search_2();
//new r_search_2();
JFrame fr=new JFrame("Search Executive Reports");
//fr.add(s.getUI());
fr.add(s.mainPanel);
fr.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
fr.setLocationByPlatform(true);
fr.setSize(1000, 400);
//fr.pack();
fr.setVisible(true);
// new r_search_2();
}
}
普通的留言:
setBounds()
语句。 您的面板使用FlowLayout,FlowLayout将确定组件的大小/位置。 下次输入任何要搜索的内容时,它不会出现。
您将表添加到BorderLayout的CENTER。 因此,您现在在CENTER中显示了两个表。 Swing按与添加表相反的顺序绘制表。 因此,第二张表首先绘制,第二张表首先绘制。 因此,第一个表被绘制在第二个表的顶部。
因此,在添加第二个滚动窗格之前,您需要先删除旧的scollpane。
但是,有一个更简单的解决方案。 正如Sergiy已经建议的那样,只需创建一个新的TableModel并替换现有表中的TableModel即可:
table.setModel( theNewModel );
因此,实际上,您应该创建JTable和滚动窗格,并在创建初始GUI时将其添加到框架中。 然后,您的搜索逻辑将仅创建一个新的DefaultTableModel,并使用上面的代码更新该表。
编辑:
在创建所有Swing组件的构造函数中,基本代码可能类似于:
mainPanel.add(topPanel, BorderLayout.PAGE_START);
JScrollPane scrollPane = new JScrollPane(table); // added
mainPanel.add(scrollPane, BorderLayout.CENTER); // added
现在,您已经创建了一个空表并将其添加到GUI。 该模型为空,因此没有任何显示。
现在,在showTableData()
方法中,您无需再创建任何Swing组件,因此,请删除所有创建滚动窗格的代码行,并将滚动窗格添加到框架中。
剩下的代码创建模型并将其添加到表中,然后将数据添加到模型中,这样它应该可以正常工作。 尽管效率更高,但您可能希望将table.setModel(...)
语句移到方法的末尾,因此,在将所有数据加载到模型中之后,该表仅更新一次。
这是一个不好的做法,但是您可以按照以下步骤进行操作
mainPanel.add(scroll);
mainPanel.revalidate()
mainPanel.repaint();
优良作法是在不必显示搜索结果的情况下,将CardLayout与空白面板一起使用。
只是快速重新设计您所做的
改进:我很快尝试将接口与代码位分开,希望对您有所帮助
public class r_search_2 extends JFrame implements ActionListener {
r_search_2(String Title)
{
super(Title);
init();
}
private void init(){
b1 = new JButton("submit");
b1.addActionListener(this);
c1 = new JComboBox(v);
c1.setEditable(true);c1.setSelectedItem("");
c1.setBounds(150, 110, 150, 20);
topPanel.add(c1);
topPanel.add(b1);
mainPanel.add(topPanel, BorderLayout.PAGE_START);
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(columnNames);
table.setModel(model);
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
table.setFillsViewportHeight(true);
JScrollPane scroll = new JScrollPane(table);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
from = (String) c1.getSelectedItem();
String section_name = "";
String report_name = "";
String contact_name = "";
String link = "";
mainPanel.add(scroll);
this.add(mainPanel);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setLocationByPlatform(true);
this.setSize(1000, 400);
this.setVisible(true);
}
public static void main(String args[]) {
r_search_2 s=new r_search_2("Search Executive Reports");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.