Java state=ConnectPostGRESql.getInstance(“postgres”).createStatement(ResultSet.TYPE\u SCROLL\u不敏感,ResultSet.CONCUR\u只读); res=state.executeQuery(查询); }捕获(SQLException e1){ System.out.println(nomps+“ajoutéavec success.”; } query=“从产品中选择*”; 表格创建(查询); 名称setText(“”); cat.setText(“”); prix.setText(“”); } } } 类SearchListener实现ActionListener{ @凌驾 已执行的公共无效操作(操作事件e){ //TODO自动生成的方法存根 字符串列; 如果(!searchText.getText().equals(“”){ 开关(String.valueOf(combo.getSelectedItem())) { 案例“ID”: column=“num_id”; 打破 案例“Nom Produit”: column=“nom_produit”; 打破 “分类”案例: column=“cat”; 打破 “马加辛”案: column=“mag”; 打破 “大奖赛”案例: column=“prix”; 打破 案例“代码Magasin”: column=“code\u magasin”; 打破 违约: column=“日期”; 打破 } 如果(!column.equals(“prix”)和(&!column.equals(“num_id”)){ query=“从产品中选择*,其中“+列+”类似“%”“+searchText.getText().toUpperCase().trim()+“%””; }否则{ query=“从产品中选择*,其中“+column+”=”+searchText.getText().toUpperCase().trim()+”; } }否则{ query=“从产品中选择*”; } 表格创建(查询); } } 类RemovelListener实现ActionListener{ @凌驾 已执行的公共无效操作(操作事件e){ //TODO自动生成的方法存根 如果(!removeText.getText().equals(“”){ 声明状态; 结果集res; 试一试{ state=ConnectPostGRESql.getInstance(“postgres”).createStatement(ResultSet.TYPE\u SCROLL\u不敏感,ResultSet.CONCUR\u只读); res=state.executeQuery(“从产品中删除,其中num_id=“+removeText.getText()); }捕获(SQLException e1){ System.out.println(“Entrée supplimeée avec success.”; } } 表格创建(“从产品中选择*); } } 私有void表创建(字符串查询){ //TODO自动生成的方法存根 试一试{ 语句状态=ConnectPostGRESql.getInstance(“postgres”).createStatement(ResultSet.TYPE\u SCROLL\u不敏感,ResultSet.CONCUR\u只读); ResultSet res=state.executeQuery(查询); ResultSetMetaData meta=res.getMetaData(); Object[]columnNames=新对象[meta.getColumnCount()]; 对于(int i=1;i
您的问题似乎是由于添加了一个新的带有JTable的JScrollPane而没有删除先前的JScrollPane引起的 例如,试着运行下面的代码Java state=ConnectPostGRESql.getInstance(“postgres”).createStatement(ResultSet.TYPE\u SCROLL\u不敏感,ResultSet.CONCUR\u只读); res=state.executeQuery(查询); }捕获(SQLException e1){ System.out.println(nomps+“ajoutéavec success.”; } query=“从产品中选择*”; 表格创建(查询); 名称setText(“”); cat.setText(“”); prix.setText(“”); } } } 类SearchListener实现ActionListener{ @凌驾 已执行的公共无效操作(操作事件e){ //TODO自动生成的方法存根 字符串列; 如果(!searchText.getText().equals(“”){ 开关(String.valueOf(combo.getSelectedItem())) { 案例“ID”: column=“num_id”; 打破 案例“Nom Produit”: column=“nom_produit”; 打破 “分类”案例: column=“cat”; 打破 “马加辛”案: column=“mag”; 打破 “大奖赛”案例: column=“prix”; 打破 案例“代码Magasin”: column=“code\u magasin”; 打破 违约: column=“日期”; 打破 } 如果(!column.equals(“prix”)和(&!column.equals(“num_id”)){ query=“从产品中选择*,其中“+列+”类似“%”“+searchText.getText().toUpperCase().trim()+“%””; }否则{ query=“从产品中选择*,其中“+column+”=”+searchText.getText().toUpperCase().trim()+”; } }否则{ query=“从产品中选择*”; } 表格创建(查询); } } 类RemovelListener实现ActionListener{ @凌驾 已执行的公共无效操作(操作事件e){ //TODO自动生成的方法存根 如果(!removeText.getText().equals(“”){ 声明状态; 结果集res; 试一试{ state=ConnectPostGRESql.getInstance(“postgres”).createStatement(ResultSet.TYPE\u SCROLL\u不敏感,ResultSet.CONCUR\u只读); res=state.executeQuery(“从产品中删除,其中num_id=“+removeText.getText()); }捕获(SQLException e1){ System.out.println(“Entrée supplimeée avec success.”; } } 表格创建(“从产品中选择*); } } 私有void表创建(字符串查询){ //TODO自动生成的方法存根 试一试{ 语句状态=ConnectPostGRESql.getInstance(“postgres”).createStatement(ResultSet.TYPE\u SCROLL\u不敏感,ResultSet.CONCUR\u只读); ResultSet res=state.executeQuery(查询); ResultSetMetaData meta=res.getMetaData(); Object[]columnNames=新对象[meta.getColumnCount()]; 对于(int i=1;i,java,swing,jtable,Java,Swing,Jtable,您的问题似乎是由于添加了一个新的带有JTable的JScrollPane而没有删除先前的JScrollPane引起的 例如,试着运行下面的代码 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.util.Random; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JFrame
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.util.Random;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
@SuppressWarnings("serial")
public class FrameFC extends JFrame {
public static void main(String[] args) {
new FrameFC();
}
private Random random = new Random();
private JPanel northPanel = new JPanel();
private JTable excel = new JTable();
private JScrollPane currentScrollPane = null;
public FrameFC() {
this.setTitle("Gestionnaire de produits");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
northPanel.add(new JButton(new AbstractAction("Change Table") {
@Override
public void actionPerformed(ActionEvent evt) {
tableCreation();
}
}));
add(northPanel, BorderLayout.PAGE_START);
tableCreation();
pack();
setLocationRelativeTo(null);
this.setVisible(true);
}
private void tableCreation() {
String[] columnNames = {"A", "B", "C"};
int rowCount = random.nextInt(10) +3;
Object[][] rowData = new Object[rowCount][columnNames.length];
for (int i = 0; i < rowData.length; i++) {
for (int j = 0; j < rowData[i].length; j++) {
rowData[i][j] = "" + random.nextInt(100) + 50;
}
}
excel = new JTable(rowData, columnNames);
excel.setAutoCreateRowSorter(true);
if (currentScrollPane != null) {
// remove(currentScrollPane); // ******* here ******
}
currentScrollPane = new JScrollPane(excel);
add(currentScrollPane);
this.revalidate();
repaint();
}
}
如果没有安装,您可能会看到保留的JScrollPane的副作用
但是,更好的解决方案是我在评论中提到的:不要交换组件,而是交换JTable中的模型。使用所需的数据创建一个DefaultTableModel,并通过在其上调用setModel(…)
来设置JTable的模型。这更干净、更安全
我也注意到,我尝试使用您的代码并删除与您的问题无关的所有位,包括任何和所有SQL代码以及与该问题无关的组件和侦听器。请在尝试调试和在本网站上的问题中考虑自己这样做。
e、 g导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入java.util.Random;
导入javax.swing.*;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableModel;
@抑制警告(“串行”)
公共类PanelFC扩展了JPanel{
私有静态最终字符串[]列名称={“A”、“B”、“C”};
私有随机=新随机();
private JPanel northPanel=new JPanel();
私有JTable excel=新JTable(modelCreation());
公共小组委员会({
添加(新的JButton(新的CreateModelAction(“创建模型”));
setLayout(新的BorderLayout());
添加(northPanel,BorderLayout.PAGE_START);
添加(新的JScrollPane(excel),BorderLayout.CENTER);
}
私有表模型模型创建(){
//您的代码将采用一些参数,并使用数据库查询
//结果,创建表模型
//此外,所有数据库代码都应该在后台线程中调用
int rowCount=random.nextInt(10)+3;
对象[][]行数据=新对象[rowCount][COLUMN_NAMES.length];
对于(int i=0;iclass SearchListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// Random query construction with the e.getText() method
if (!column.equals("prix") && !column.equals("num_id")){
query = "select * from products where " + column + " like '%" + searchText.getText().toUpperCase().trim() + "%'";
}else{
query = "select * from products where " + column + " = '" + searchText.getText().toUpperCase().trim() + "'";
}
}else{
query = "select * from products";
}
tableCreation(query);
}
}
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextField;
public class FrameFC extends JFrame{
public static void main(String[] args) {
FrameFC fr = new FrameFC();
}
/*Main Frame Creation*/
private JSplitPane split;
private Font f = new Font("Arial", Font.PLAIN, 15);
private JScrollPane scroll = new JScrollPane();
/*Panel Creation*/
private JPanel mainPanel = new JPanel();
private JPanel westPanel = new JPanel();
private JPanel eastPanel = new JPanel();
private JPanel addPanel = new JPanel();
private JPanel searchPanel = new JPanel();
private JPanel removePanel = new JPanel();
private int screenHeight = (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight());
private int screenWidth = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth());
private JButton buttonAdd = new JButton("Ajouter"),
buttonSearch = new JButton("Rechercher"),
buttonRemove = new JButton("Supprimer");
private JTextField nomP = new JTextField(),
cat = new JTextField(),
mag = new JTextField(),
prix = new JTextField(),
dateAchat = new JTextField(),
codemag = new JTextField(),
removeText = new JTextField();
private JTextField searchText = new JTextField();
private String[] tabCat = {"ID", "Nom Produit", "Categorie", "Magasin", "Prix", "Date (JJ/MM/AAAA)", "Code Magasin"};
private JComboBox combo = new JComboBox(tabCat);
/*Table Creation*/
private JPanel tablePanel = new JPanel();
private JTable excel = new JTable();
private String query = "select * from products order by num_id";
public FrameFC(){
this.setTitle("Gestionnaire de produits");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
this.setLayout(new BorderLayout());
panelCreation();
tableCreation(query);
this.setVisible(true);
}
class AjouterListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (nomP.getText().equals("") ||
cat.getText().equals("") ||
mag.getText().equals("") ||
prix.getText().equals("") ||
dateAchat.getText().equals("")){
}else{
String nomps, cats, mags, prixs, dates;
nomps = nomP.getText();
cats = cat.getText();
mags = mag.getText();
prixs = prix.getText();
dates = dateAchat.getText();
query = "insert into products "
+ "(nom_produit, cat, mag, prix, date_achat, code_magasin)"
+ " values ("
+ "'" + nomps + "', '" + cats
+ "', '" + mags + "', " + prixs
+ ", '" + dates + "', '" + codemag.getText() + "');";
Statement state;
ResultSet res;
try {
state = ConnectPostGRESql.getInstance("postgres").createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
res = state.executeQuery(query);
} catch (SQLException e1) {
System.out.println(nomps + " ajouté avec succès.");
}
query = "select * from products";
tableCreation(query);
nomP.setText("");
cat.setText("");
prix.setText("");
}
}
}
class SearchListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String column;
if (!searchText.getText().equals("")){
switch (String.valueOf(combo.getSelectedItem()))
{
case "ID":
column = "num_id";
break;
case "Nom Produit":
column = "nom_produit";
break;
case "Categorie":
column = "cat";
break;
case "Magasin":
column = "mag";
break;
case "Prix":
column = "prix";
break;
case "Code Magasin":
column = "code_magasin";
break;
default:
column = "date_achat";
break;
}
if (!column.equals("prix") && !column.equals("num_id")){
query = "select * from products where " + column + " like '%" + searchText.getText().toUpperCase().trim() + "%'";
}else{
query = "select * from products where " + column + " = '" + searchText.getText().toUpperCase().trim() + "'";
}
}else{
query = "select * from products";
}
tableCreation(query);
}
}
class RemoveListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (!removeText.getText().equals("")){
Statement state;
ResultSet res;
try {
state = ConnectPostGRESql.getInstance("postgres").createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
res = state.executeQuery("delete from products where num_id = " + removeText.getText());
} catch (SQLException e1) {
System.out.println("Entrée supprimée avec succès.");
}
}
tableCreation("select * from products");
}
}
private void tableCreation(String query) {
// TODO Auto-generated method stub
try {
Statement state = ConnectPostGRESql.getInstance("postgres").createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet res = state.executeQuery(query);
ResultSetMetaData meta = res.getMetaData();
Object[] columnNames = new Object[meta.getColumnCount()];
for (int i = 1; i<=meta.getColumnCount();i++){
columnNames[i-1] = meta.getColumnName(i);
}
res.last();
Object[][] rowData = new Object[res.getRow()][meta.getColumnCount()];
res.beforeFirst();
int j = 1;
while (res.next()){
for (int i = 1; i <= meta.getColumnCount(); i++){
if (i == 1){
int nombredez = 4 - String.valueOf(res.getInt(i)).length();
String nombredezString = "";
for (int n = 0; n < nombredez;n++){
nombredezString += "0";
}
rowData[j-1][i-1] = nombredezString + String.valueOf(res.getObject(i));
}
else{
rowData[j-1][i-1] = res.getObject(i);
}
}
j++;
}
res.close();
state.close();
excel = new JTable(rowData, columnNames);
excel.setAutoCreateRowSorter(true);
} catch (Exception e) {
e.printStackTrace();
}
tablePanel.removeAll();
this.getContentPane().add(new JScrollPane(tablePanel.add(excel)), BorderLayout.CENTER);
this.revalidate();
}
private void panelCreation() {
// TODO Auto-generated method stub
/*Panel Add (West)*/
addPanel.setLayout(new GridLayout(7,2));
addPanel.add(new JLabel("Entrez le nom du produit :"));
addPanel.add(nomP);
addPanel.add(new JLabel("Entrez la catégorie :"));
addPanel.add(cat);
addPanel.add(new JLabel("Entrez le magasin :"));
addPanel.add(mag);
addPanel.add(new JLabel("Entrez le prix :"));
addPanel.add(prix);
addPanel.add(new JLabel("Entrez la date :"));
addPanel.add(dateAchat);
addPanel.add(new JLabel("Entrez le code magasin"));
addPanel.add(codemag);
addPanel.add(new JLabel());
buttonAdd.addActionListener(new AjouterListener());
addPanel.add(buttonAdd);
addPanel.setBorder(BorderFactory.createTitledBorder("Ajouter"));
addPanel.setPreferredSize(new Dimension(949, 360));
/*Panel Search (North-East)*/
searchPanel.setLayout(new GridLayout(2,2));
searchPanel.add(combo);
searchPanel.add(searchText);
searchPanel.add(new JLabel());
buttonSearch.addActionListener(new SearchListener());
searchPanel.add(buttonSearch);
searchPanel.setBorder(BorderFactory.createTitledBorder("Rechercher"));
searchPanel.setPreferredSize(new Dimension(949, 180));
/*Panel Remove (South-East)*/
removePanel.setLayout(new GridLayout(2,2));
removePanel.add(new JLabel("Entrez le numero d'identifiant : "));
removePanel.add(removeText);
removePanel.add(new JLabel());
buttonRemove.addActionListener(new RemoveListener());
removePanel.add(buttonRemove);
removePanel.setBorder(BorderFactory.createTitledBorder("Supprimer"));
removePanel.setPreferredSize(new Dimension(949, 180));
/*MainPanel on Frame*/
westPanel.setBorder(BorderFactory.createLineBorder(Color.black, 2));
westPanel.add(addPanel);
eastPanel.setLayout(new BorderLayout());
eastPanel.setBorder(BorderFactory.createLineBorder(Color.black, 2));
eastPanel.add(searchPanel, BorderLayout.NORTH);
eastPanel.add(removePanel, BorderLayout.SOUTH);
mainPanel.setLayout(new BorderLayout());
mainPanel.add(westPanel, BorderLayout.WEST);
mainPanel.add(eastPanel, BorderLayout.EAST);
this.getContentPane().add(new JScrollPane(mainPanel), BorderLayout.NORTH);
}
}
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.util.Random;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
@SuppressWarnings("serial")
public class FrameFC extends JFrame {
public static void main(String[] args) {
new FrameFC();
}
private Random random = new Random();
private JPanel northPanel = new JPanel();
private JTable excel = new JTable();
private JScrollPane currentScrollPane = null;
public FrameFC() {
this.setTitle("Gestionnaire de produits");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
northPanel.add(new JButton(new AbstractAction("Change Table") {
@Override
public void actionPerformed(ActionEvent evt) {
tableCreation();
}
}));
add(northPanel, BorderLayout.PAGE_START);
tableCreation();
pack();
setLocationRelativeTo(null);
this.setVisible(true);
}
private void tableCreation() {
String[] columnNames = {"A", "B", "C"};
int rowCount = random.nextInt(10) +3;
Object[][] rowData = new Object[rowCount][columnNames.length];
for (int i = 0; i < rowData.length; i++) {
for (int j = 0; j < rowData[i].length; j++) {
rowData[i][j] = "" + random.nextInt(100) + 50;
}
}
excel = new JTable(rowData, columnNames);
excel.setAutoCreateRowSorter(true);
if (currentScrollPane != null) {
// remove(currentScrollPane); // ******* here ******
}
currentScrollPane = new JScrollPane(excel);
add(currentScrollPane);
this.revalidate();
repaint();
}
}
// remove(currentScrollPane); // ******* here ******
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.util.Random;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
@SuppressWarnings("serial")
public class PanelFC extends JPanel {
private static final String[] COLUMN_NAMES = {"A", "B", "C"};
private Random random = new Random();
private JPanel northPanel = new JPanel();
private JTable excel = new JTable(modelCreation());
public PanelFC() {
northPanel.add(new JButton(new CreateModelAction("Create Model")));
setLayout(new BorderLayout());
add(northPanel, BorderLayout.PAGE_START);
add(new JScrollPane(excel), BorderLayout.CENTER);
}
private TableModel modelCreation() {
// your code will take some parameter, and using database query
// result, create the table model
// Also, all database code should be called in a background thread
int rowCount = random.nextInt(10) +3;
Object[][] rowData = new Object[rowCount][COLUMN_NAMES.length];
for (int i = 0; i < rowData.length; i++) {
for (int j = 0; j < rowData[i].length; j++) {
rowData[i][j] = "" + random.nextInt(100) + 50;
}
}
DefaultTableModel model = new DefaultTableModel(rowData, COLUMN_NAMES);
return model;
}
private class CreateModelAction extends AbstractAction {
public CreateModelAction(String name) {
super(name);
int mnemonic = (int) name.charAt(0);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
excel.setModel(modelCreation());
}
}
private static void createAndShowGui() {
PanelFC mainPanel = new PanelFC();
JFrame frame = new JFrame("PanelFC");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}