【问题标题】:Java repaint does not do anythingJava重绘不做任何事情
【发布时间】:2017-02-05 09:09:40
【问题描述】:

这是我的问题: 我有一个 JPanel 订单,其中有不同的组件;一个 JTable 和几个 JLabel。

这些组件填充了来自对象“commande”(订单)的数据,例如:idOrder、customer、Price...

这个 JPanel 位于另一个 Jpanel 中,该 Jpanel 也包含一个 jtable (orderlist)

当我点击jtable orderlist中的一个订单时,我希望将这个订单的信息打印在jpannel Order上。

现在,我单击,我的对象顺序已正确更新,但我无法执行 JPanel 的 repaint()。什么都没有发生。

这里是代码

   public class PanneauDetailCommande extends JPanel{
        Commande commande;
        PanneauDetailCommande(){}

        public void setCommande(Commande commande){this.commande=commande;}

        public void paintComponent(Graphics g){

          String colorPaye=commande.isPaye()? "GREEN" : "RED";

          this.setBackground(Color.white);

          this.setBorder(BorderFactory.createLineBorder(Color.black));

          this.setPreferredSize(new Dimension(600,300));

          JLabel labelDetail=new JLabel("<html><p style=\"padding-left:15px;\"><font  size=4 > Détail commande<font color=\""+colorPaye+"\" size=4 > No  "+(commande.getIdCommande())+"</font> :</font></p></html>");

         labelDetail.setPreferredSize(new Dimension(598,20));

         labelDetail.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.black));

         labelDetail.setOpaque(true);

         labelDetail.setBackground(Color.white );

         this.add(labelDetail);

 }}

另一个调用JPannel detailCommande的类JPannel:

 historique.table.getSelectionModel().addListSelectionListener(new   ListSelectionListener(){

       @Override

public void valueChanged(ListSelectionEvent e) {

   // TODO Auto-generated method stub

       int newId=Integer.parseInt(historique.table.getValueAt(historique.table.getSelectedRow(), 0).toString());

       Commande newCommande = gestionCommande.getCommande(newId);

       detail.setCommande(newCommande);

       detail.repaint();

       }});

【问题讨论】:

  • 什么都不做?还是什么都不做?
  • 请正确格式化您的代码
  • 大声笑,我的意思是“什么都没发生”
  • 好的,谢谢@Massimo

标签: java swing repaint


【解决方案1】:

一般来说,您不应该在paintComponent 方法中添加组件。您应该将它们添加到事件处理程序中,基本上是在您调用 setCommande 然后在您的组件上调用 revalidate 时。

中查看答案和代码

java - How would I dynamically add swing component to gui on click?

【讨论】:

  • 好的,所以我做了一个方法 drawPannel(),我拥有所有组件,setCommande() 调用 drawPannel(),并执行 Revalidate(),但没有任何反应:public void setCommande(Commande commande) { this.commande=commande; this.drawPannel(); this.revalidate();} /*pour starteder ,on affiche la dernière commande*/ public void drawPannel(){ /*le panneau*/ this.setBackground(Color.white);.....ect.... }
【解决方案2】:

好的,所以我确实将所有组件放入了一个名为 drawPannel() 的方法中, 我的方法 setcommnade() 调用 drawPannel(),如下所示:

public void setCommande(Commande commande){
    this.commande=commande;
    this.drawPannel();
    }

    /*pour commencer ,on affiche la dernière commande*/
public void drawPannel(){
    /*le panneau*/
    this.setBackground(Color.white);
    ...ect}

。然后,在我的 actionListener 中,我尝试了 invalidate();validate();repaint();revalidate();但什么也没发生。

我尝试更改组件的背景颜色,然后到 system.out.print 我的组件颜色以查看更改是否完成,它工作正常但我无法刷新屏幕。

public void valueChanged(ListSelectionEvent e) {

                    System.out.println(detail.getComponents()[0].getBackground());//java.awt.Color[r=255,g=255,b=255]
                    detail.getComponents()[0].setBackground(Color.BLACK);
                    System.out.println(detail.getComponents()[0].getBackground());//java.awt.Color[r=0,g=0,b=0]
                    //detail.setCommande(newCommande);
                    detail.invalidate();
                    detail.validate();
                    detail.repaint();
               }});

【讨论】:

    【解决方案3】:

    好的,如果它可以帮助某人,我有答案:

    我愿意:

    public void valueChanged(ListSelectionEvent e) {
                        detail.setCommande(newCommande);
                        revalidate();
                        repaint();
                   }});
    

    而不是:

    public void valueChanged(ListSelectionEvent e) {
                        detail.setCommande(newCommande);
                        detail.revalidate();
                        detail.repaint();
                   }});
    

    总之,我重新粉刷整个主面板,而不是内部面板

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多