Java 如何在我的gui中绘制精确的行数?

Java 如何在我的gui中绘制精确的行数?,java,swing,user-interface,paintcomponent,Java,Swing,User Interface,Paintcomponent,我正在尝试在gui中绘制精确的行数。因此,我使用TableModelListener来监听Jtable中的行数,并在每次向表中添加新行时显示行数 问题:但是现在,当我的jtable中有x行时,我想在gui中画x行。我试图像上面那样放置一个TableModelListerner,但它不起作用 谢谢你的帮助。很抱歉,我放了很多类,但我还想学习制作可重用代码和学习JavaSwing 课堂测试 import java.awt.GridLayout; import javax.swing.JFrame

我正在尝试在gui中绘制精确的行数。因此,我使用TableModelListener来监听Jtable中的行数,并在每次向表中添加新行时显示行数

问题:但是现在,当我的jtable中有x行时,我想在gui中画x行。我试图像上面那样放置一个TableModelListerner,但它不起作用

谢谢你的帮助。很抱歉,我放了很多类,但我还想学习制作可重用代码和学习JavaSwing

课堂测试

import java.awt.GridLayout;

import javax.swing.JFrame;

public class Test {

    public static void main(String[] args) {
        JFrame f = new JFrame();

        f.setLayout(new GridLayout(1, 2, 5, 5));

        TablePanel tablePanel = new TablePanel();
        ButtonPanel buttonPanel = new ButtonPanel();
        DrawTwoSameDrawPanel drawPanels = new DrawTwoSameDrawPanel();

        f.add(tablePanel);
        f.add(buttonPanel);
        f.add(drawPanels);

        f.setSize(800, 300);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);

    }

}
类别MyTableModel

import javax.swing.table.AbstractTableModel;

public class MyTableModel extends AbstractTableModel {

    private String[] columnNames = { "RowListener", "B", "C" };
    private Object[][] data = { { "x", "xx", "xxx" }, { "y", "yy", "yyy" }, { "z", "zz", "zzz" } };

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public int getRowCount() {
        return data.length;
    }

    @Override
    public Object getValueAt(int row, int col) {
        return data[row][col];
    }

    @Override
    public Class<?> getColumnClass(int col) {
        return data[0][col].getClass();
    }

    @Override
    public String getColumnName(int col) {
        return columnNames[col];
    }

    @Override
    public void setValueAt(Object aValue, int row, int col) {
        data[row][col] = aValue;
        fireTableStructureChanged();
    }

    public void addRow(Object[][] data) {
        int index = 0;
        int nbRow = this.getRowCount();
        int nbCol = this.getColumnCount();

        Object temp[][] = this.data;
        this.data = new Object[nbRow + 1][nbCol];

        for (Object[] value : temp)
            this.data[index++] = value;

        this.data[index] = data;
        temp = null;

        this.fireTableDataChanged();

    }

}
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class ButtonPanel extends JPanel {

    private JButton button;
    private DrawPanel drawPanel;

    public ButtonPanel() {
        super();

        this.setBorder(new LineBorder(Color.red));
        button = new JButton("Update");
        this.add(button);
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("hello console");

                int n = JOptionPane.showConfirmDialog(null, "Would you like to update drawPanel ?", "Question",
                        JOptionPane.YES_NO_OPTION);

                if (n == JOptionPane.YES_OPTION) {
                    System.out.println("console : YES");
                    updatePanels();
                }
                else
                    System.out.println("console : NO");
            }

        });
    }

    public void updatePanels() {
        drawPanel = new DrawPanel();        
        drawPanel.revalidate();
        drawPanel.repaint();

    }
}
public class DrawPanel extends JPanel implements TableModelListener{

    private MyTableModel model = new MyTableModel();
    private JTable table = new JTable(model);

    private int numberOfLine = 0;

    public DrawPanel() {
        super();
        this.setBorder(new LineBorder(Color.blue));
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics graphics = g.create();
        int y = 10;

        /////////don't work 
        RowListener rowListener = new RowListener(model);
        numberOfLine = rowListener.getNumberOfRow();
        //////////

        for (int i = 0; i < numberOfLine; i++) {
            graphics.drawLine(10, y, getWidth() - 10, y);
            y += 10;
        }
        graphics.dispose();
    }

    public void setNumberOfArrows(int arrows) {
        numberOfLine = arrows;
        repaint();
    }

    public int getNumberOfArrows() {
        return numberOfLine;
    }

    @Override
    public Dimension getPreferredSize() {
        return isPreferredSizeSet() ? super.getPreferredSize() : new Dimension(200, 200);
    }

     @Override
     public void tableChanged(TableModelEvent arg0) {
     int numberOfRow = model.getRowCount();
     this.setNumberOfArrows(numberOfRow);
     System.out.println("numberOfRow: " + numberOfRow);

     }

    class RowListener implements TableModelListener {
        private MyTableModel model;
        private int numberOfRow;

        public RowListener(MyTableModel model) {
            this.model = model;
            model.addTableModelListener(this);
        }

        @Override
        public void tableChanged(TableModelEvent arg0) {
            numberOfRow = model.getRowCount();          
            System.out.println("numberOfRow: " + numberOfRow);
        }

        public int getNumberOfRow() {
            return numberOfRow;
        }

        public void setNumberOfRow(int numberOfRow) {
            this.numberOfRow = numberOfRow;
        }
    }

}
public class TablePanel extends JPanel {

private MyTableModel model = new MyTableModel();
private JTable table = new JTable(model);
private int nbRow = 0;

private JButton addButton = new JButton("Add Row");

public TablePanel() {
    super();
    this.setBorder(new LineBorder(Color.orange));
    this.add(table);
    this.add(addButton);

    addButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            model.addRow(new Object[][] { { "u", "u", "u" }, { "v", "v", "vy" }, { "w", "w", "w" } });
            model.fireTableStructureChanged();
            nbRow = model.getRowCount();
            System.out.println("nbRow: " + nbRow);

        }
    });

    this.add(createDisplayNbRowPanel());

}

public JPanel createDisplayNbRowPanel() {
    JPanel p = new JPanel();
    p.add(new JLabel("number of row : "));
    NbRowView nbRowView = new NbRowView(model);
    p.add(nbRowView);
    p.setBorder(new LineBorder(Color.red));

    return p;
}

public int getNbRow() {
    return nbRow;
}

public void setNbRow(int nbRow) {
    this.nbRow = nbRow;
}

class NbRowView extends JLabel implements TableModelListener {

    private MyTableModel model;

    public NbRowView(MyTableModel model) {
        this.model = model;
        model.addTableModelListener(this);
    }

    @Override
    public void tableChanged(TableModelEvent arg0) {
        int nbOfRow = model.getRowCount();
        this.setText(nbOfRow + "");
        DrawPanel drawPanel = new DrawPanel();
        drawPanel.setNumberOfArrows(nbOfRow);

    }

}

}
public class DrawTwoSameDrawPanel extends JPanel {

private DrawPanel drawPanel_1 = new DrawPanel();
private DrawPanel drawPanel_2 = new DrawPanel();

public DrawTwoSameDrawPanel() {
    super();
    this.setBorder(new LineBorder(Color.green));
    this.add(drawPanel_1);
    this.add(drawPanel_2);
}

}
类绘图面板

import javax.swing.table.AbstractTableModel;

public class MyTableModel extends AbstractTableModel {

    private String[] columnNames = { "RowListener", "B", "C" };
    private Object[][] data = { { "x", "xx", "xxx" }, { "y", "yy", "yyy" }, { "z", "zz", "zzz" } };

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public int getRowCount() {
        return data.length;
    }

    @Override
    public Object getValueAt(int row, int col) {
        return data[row][col];
    }

    @Override
    public Class<?> getColumnClass(int col) {
        return data[0][col].getClass();
    }

    @Override
    public String getColumnName(int col) {
        return columnNames[col];
    }

    @Override
    public void setValueAt(Object aValue, int row, int col) {
        data[row][col] = aValue;
        fireTableStructureChanged();
    }

    public void addRow(Object[][] data) {
        int index = 0;
        int nbRow = this.getRowCount();
        int nbCol = this.getColumnCount();

        Object temp[][] = this.data;
        this.data = new Object[nbRow + 1][nbCol];

        for (Object[] value : temp)
            this.data[index++] = value;

        this.data[index] = data;
        temp = null;

        this.fireTableDataChanged();

    }

}
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class ButtonPanel extends JPanel {

    private JButton button;
    private DrawPanel drawPanel;

    public ButtonPanel() {
        super();

        this.setBorder(new LineBorder(Color.red));
        button = new JButton("Update");
        this.add(button);
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("hello console");

                int n = JOptionPane.showConfirmDialog(null, "Would you like to update drawPanel ?", "Question",
                        JOptionPane.YES_NO_OPTION);

                if (n == JOptionPane.YES_OPTION) {
                    System.out.println("console : YES");
                    updatePanels();
                }
                else
                    System.out.println("console : NO");
            }

        });
    }

    public void updatePanels() {
        drawPanel = new DrawPanel();        
        drawPanel.revalidate();
        drawPanel.repaint();

    }
}
public class DrawPanel extends JPanel implements TableModelListener{

    private MyTableModel model = new MyTableModel();
    private JTable table = new JTable(model);

    private int numberOfLine = 0;

    public DrawPanel() {
        super();
        this.setBorder(new LineBorder(Color.blue));
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics graphics = g.create();
        int y = 10;

        /////////don't work 
        RowListener rowListener = new RowListener(model);
        numberOfLine = rowListener.getNumberOfRow();
        //////////

        for (int i = 0; i < numberOfLine; i++) {
            graphics.drawLine(10, y, getWidth() - 10, y);
            y += 10;
        }
        graphics.dispose();
    }

    public void setNumberOfArrows(int arrows) {
        numberOfLine = arrows;
        repaint();
    }

    public int getNumberOfArrows() {
        return numberOfLine;
    }

    @Override
    public Dimension getPreferredSize() {
        return isPreferredSizeSet() ? super.getPreferredSize() : new Dimension(200, 200);
    }

     @Override
     public void tableChanged(TableModelEvent arg0) {
     int numberOfRow = model.getRowCount();
     this.setNumberOfArrows(numberOfRow);
     System.out.println("numberOfRow: " + numberOfRow);

     }

    class RowListener implements TableModelListener {
        private MyTableModel model;
        private int numberOfRow;

        public RowListener(MyTableModel model) {
            this.model = model;
            model.addTableModelListener(this);
        }

        @Override
        public void tableChanged(TableModelEvent arg0) {
            numberOfRow = model.getRowCount();          
            System.out.println("numberOfRow: " + numberOfRow);
        }

        public int getNumberOfRow() {
            return numberOfRow;
        }

        public void setNumberOfRow(int numberOfRow) {
            this.numberOfRow = numberOfRow;
        }
    }

}
public class TablePanel extends JPanel {

private MyTableModel model = new MyTableModel();
private JTable table = new JTable(model);
private int nbRow = 0;

private JButton addButton = new JButton("Add Row");

public TablePanel() {
    super();
    this.setBorder(new LineBorder(Color.orange));
    this.add(table);
    this.add(addButton);

    addButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            model.addRow(new Object[][] { { "u", "u", "u" }, { "v", "v", "vy" }, { "w", "w", "w" } });
            model.fireTableStructureChanged();
            nbRow = model.getRowCount();
            System.out.println("nbRow: " + nbRow);

        }
    });

    this.add(createDisplayNbRowPanel());

}

public JPanel createDisplayNbRowPanel() {
    JPanel p = new JPanel();
    p.add(new JLabel("number of row : "));
    NbRowView nbRowView = new NbRowView(model);
    p.add(nbRowView);
    p.setBorder(new LineBorder(Color.red));

    return p;
}

public int getNbRow() {
    return nbRow;
}

public void setNbRow(int nbRow) {
    this.nbRow = nbRow;
}

class NbRowView extends JLabel implements TableModelListener {

    private MyTableModel model;

    public NbRowView(MyTableModel model) {
        this.model = model;
        model.addTableModelListener(this);
    }

    @Override
    public void tableChanged(TableModelEvent arg0) {
        int nbOfRow = model.getRowCount();
        this.setText(nbOfRow + "");
        DrawPanel drawPanel = new DrawPanel();
        drawPanel.setNumberOfArrows(nbOfRow);

    }

}

}
public class DrawTwoSameDrawPanel extends JPanel {

private DrawPanel drawPanel_1 = new DrawPanel();
private DrawPanel drawPanel_2 = new DrawPanel();

public DrawTwoSameDrawPanel() {
    super();
    this.setBorder(new LineBorder(Color.green));
    this.add(drawPanel_1);
    this.add(drawPanel_2);
}

}
类DrawTwoSameDrawPanel

import javax.swing.table.AbstractTableModel;

public class MyTableModel extends AbstractTableModel {

    private String[] columnNames = { "RowListener", "B", "C" };
    private Object[][] data = { { "x", "xx", "xxx" }, { "y", "yy", "yyy" }, { "z", "zz", "zzz" } };

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public int getRowCount() {
        return data.length;
    }

    @Override
    public Object getValueAt(int row, int col) {
        return data[row][col];
    }

    @Override
    public Class<?> getColumnClass(int col) {
        return data[0][col].getClass();
    }

    @Override
    public String getColumnName(int col) {
        return columnNames[col];
    }

    @Override
    public void setValueAt(Object aValue, int row, int col) {
        data[row][col] = aValue;
        fireTableStructureChanged();
    }

    public void addRow(Object[][] data) {
        int index = 0;
        int nbRow = this.getRowCount();
        int nbCol = this.getColumnCount();

        Object temp[][] = this.data;
        this.data = new Object[nbRow + 1][nbCol];

        for (Object[] value : temp)
            this.data[index++] = value;

        this.data[index] = data;
        temp = null;

        this.fireTableDataChanged();

    }

}
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;

public class ButtonPanel extends JPanel {

    private JButton button;
    private DrawPanel drawPanel;

    public ButtonPanel() {
        super();

        this.setBorder(new LineBorder(Color.red));
        button = new JButton("Update");
        this.add(button);
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("hello console");

                int n = JOptionPane.showConfirmDialog(null, "Would you like to update drawPanel ?", "Question",
                        JOptionPane.YES_NO_OPTION);

                if (n == JOptionPane.YES_OPTION) {
                    System.out.println("console : YES");
                    updatePanels();
                }
                else
                    System.out.println("console : NO");
            }

        });
    }

    public void updatePanels() {
        drawPanel = new DrawPanel();        
        drawPanel.revalidate();
        drawPanel.repaint();

    }
}
public class DrawPanel extends JPanel implements TableModelListener{

    private MyTableModel model = new MyTableModel();
    private JTable table = new JTable(model);

    private int numberOfLine = 0;

    public DrawPanel() {
        super();
        this.setBorder(new LineBorder(Color.blue));
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics graphics = g.create();
        int y = 10;

        /////////don't work 
        RowListener rowListener = new RowListener(model);
        numberOfLine = rowListener.getNumberOfRow();
        //////////

        for (int i = 0; i < numberOfLine; i++) {
            graphics.drawLine(10, y, getWidth() - 10, y);
            y += 10;
        }
        graphics.dispose();
    }

    public void setNumberOfArrows(int arrows) {
        numberOfLine = arrows;
        repaint();
    }

    public int getNumberOfArrows() {
        return numberOfLine;
    }

    @Override
    public Dimension getPreferredSize() {
        return isPreferredSizeSet() ? super.getPreferredSize() : new Dimension(200, 200);
    }

     @Override
     public void tableChanged(TableModelEvent arg0) {
     int numberOfRow = model.getRowCount();
     this.setNumberOfArrows(numberOfRow);
     System.out.println("numberOfRow: " + numberOfRow);

     }

    class RowListener implements TableModelListener {
        private MyTableModel model;
        private int numberOfRow;

        public RowListener(MyTableModel model) {
            this.model = model;
            model.addTableModelListener(this);
        }

        @Override
        public void tableChanged(TableModelEvent arg0) {
            numberOfRow = model.getRowCount();          
            System.out.println("numberOfRow: " + numberOfRow);
        }

        public int getNumberOfRow() {
            return numberOfRow;
        }

        public void setNumberOfRow(int numberOfRow) {
            this.numberOfRow = numberOfRow;
        }
    }

}
public class TablePanel extends JPanel {

private MyTableModel model = new MyTableModel();
private JTable table = new JTable(model);
private int nbRow = 0;

private JButton addButton = new JButton("Add Row");

public TablePanel() {
    super();
    this.setBorder(new LineBorder(Color.orange));
    this.add(table);
    this.add(addButton);

    addButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            model.addRow(new Object[][] { { "u", "u", "u" }, { "v", "v", "vy" }, { "w", "w", "w" } });
            model.fireTableStructureChanged();
            nbRow = model.getRowCount();
            System.out.println("nbRow: " + nbRow);

        }
    });

    this.add(createDisplayNbRowPanel());

}

public JPanel createDisplayNbRowPanel() {
    JPanel p = new JPanel();
    p.add(new JLabel("number of row : "));
    NbRowView nbRowView = new NbRowView(model);
    p.add(nbRowView);
    p.setBorder(new LineBorder(Color.red));

    return p;
}

public int getNbRow() {
    return nbRow;
}

public void setNbRow(int nbRow) {
    this.nbRow = nbRow;
}

class NbRowView extends JLabel implements TableModelListener {

    private MyTableModel model;

    public NbRowView(MyTableModel model) {
        this.model = model;
        model.addTableModelListener(this);
    }

    @Override
    public void tableChanged(TableModelEvent arg0) {
        int nbOfRow = model.getRowCount();
        this.setText(nbOfRow + "");
        DrawPanel drawPanel = new DrawPanel();
        drawPanel.setNumberOfArrows(nbOfRow);

    }

}

}
public class DrawTwoSameDrawPanel extends JPanel {

private DrawPanel drawPanel_1 = new DrawPanel();
private DrawPanel drawPanel_2 = new DrawPanel();

public DrawTwoSameDrawPanel() {
    super();
    this.setBorder(new LineBorder(Color.green));
    this.add(drawPanel_1);
    this.add(drawPanel_2);
}

}
当jtable中有x行时,我想在gui中画x行

看看前面的问题:您已经很好地实现了
DrawPanel
paintComponent()
方法,但仍然需要将其与表模型解耦。正如其他开发人员所说,您的代码庞大而复杂,您需要更好地组织它:

  • 创建可重复使用的面板,如中所示
  • 创建表模型的新实例时,请附加一个新的to call
    setNumberOfArrows()
    方法,该方法将根据需要重新绘制面板
  • 例如:

    class GuiClass {
    
        private DrawPanel drawPanel;
    
        public void createAndShowGui() {
            drawPanel = new DrawPanel();
            MyTableModel model = new MyTableModel();
            model.addTableModelListener(new TableModelListener() { // Anonymous class
                @Override
                public void tableChanged(TableModelEvent e) {
                    if(e.getType() == TableModelEvent.INSERT || e.getType() == TableModelEvent.DELETE) {
                        int rows = ((TableModel)e.getSource()).getRowCount();
                        drawPanel.setNumberOfArrows(rows);
                    }
                }
            });
            // rest of your GUI code here
        }
    }
    
    注意:Java提供了一种很好的机制,可以避免创建过多的类来实现接口或扩展其他类:

    关于您的表模型,请注意它看起来很像,所以您可能希望使用该类而不是创建自己的类(当然,如果它符合您的要求的话)

    此外,方法的实现永远不应该查找数据来检索值,因为您知道表模型将包含什么类型的数据,所以应该能够返回正确的类

    最后,您的
    addRow(Object[][]row)
    方法没有意义,因为您可能希望向表模型中添加一行,而不是行和列。我认为它应该是
    addRow(Object[]row)
    (注意一维数组作为参数)。话虽如此,它应该是这样的:

    public void addRow(Object[] row) {
        // add row here
        int rowIndex = data.length;
        fireTableRowsInserted(rowIndex, rowIndex);
    }
    
    见:


    为什么不直接查询表模型中(可见)元素的数量?这样你就可以得到要画的线的数量。顺便说一句,“它不工作”并没有多大帮助。您可能需要详细说明它不起作用的方式,例如,您期望的是什么,而您得到的是什么,可能需要一些示例来支持。您可能需要一个
    ChangeListener
    来侦听选择的更改,或者可以使用
    TableModelListener
    侦听表数据更改?1)结构太复杂,代码太多。2) 您总是在不需要这样做的地方创建新实例:
    drawPanel=newdrawpanel()
    RowListener RowListener=新的RowListener(模型)3)似乎不起作用,因为在
    updatePanels()
    方法中,您创建了一个新面板,但显示了旧面板<代码>绘图面板=新建绘图面板()-不替换
    JFrame
    上的可见实例。要更快获得更好的帮助,请发布一个(最小、完整、可验证的示例)。非常感谢。非常有用的回答:欢迎你:)如果你还有疑问或不知道如何把所有的部分放在一起,请告诉我。我可以举个例子来帮助你@用户3748551