当前位置: 首页 > 知识库问答 >
问题:

java摆动jPanel不会刷新

夏振国
2023-03-14

在我的摆动应用程序中,我在一个框架中有两个面板。第一个面板有一个按钮。当我单击此按钮时,一些数据会发生变化,我希望第二个面板的内容也会发生变化,显示新数据(通过jtag)。repaint()不起作用。我尝试了各种更新(参见代码中的注释)。

我提到了第二个小组。我可以使用该引用更改第二个面板的颜色,但无法重新绘制。我也可以在第二个面板中引用jlabel,只需更改其文本,但这个问题的重点是使panel2刷新。

SSCCE如下。请看一看。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EtchedBorder;

public class Repaint_Test
{
    public static void main(String args[]){     
        Frame frame = new Frame();      
    }
}

class Frame extends JFrame
{
    public Frame()  {   
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(500,250);
        this.setLocationRelativeTo(null);
        this.setLayout(new GridLayout(1,2));        
        Panel1 p1 = new Panel1();
        Panel2 p2 = new Panel2();
        Data.panel2 = p2; // getting the reference of panel2    
        this.add(p1);
        this.add(p2);       
        this.setVisible(true);
    }
}

class Panel1 extends JPanel
{
    public Panel1(){
        this.setBorder(BorderFactory.createTitledBorder(new EtchedBorder(),"Panel1:"));
        JButton button = new JButton("Push");
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){         
                Data.text = "text"; // changing commonly accessed data              
                Data.panel2.setBackground(Color.PINK); // this works
                //Data.panel2.invalidate();
                //Data.panel2.validate();
                //Data.panel2.updateUI();
                //Data.panel2.revalidate();
                Data.panel2.repaint();                // this does not work             
            }
        });
        this.add(button);       
    }   
}

class Panel2 extends JPanel
{
    public Panel2(){
        this.setBorder(BorderFactory.createTitledBorder(new EtchedBorder(),"Panel2:"));     
        add(new JLabel(Data.text));
    }   
}

class Data
{   
    public static JPanel panel2 = null; 
    public static String text = "ooooo";
}

解决方案

多亏了奥斯汀·帕特尔的建议,我得以实现我的目标,甚至刷新(重新绘制)了panel2。为此,在Panel2类内创建了一个更新方法。所有panel2更改都在那里进行,然后从update调用revalidate()和repaint()方法来刷新panel2。

共有1个答案

邢博文
2023-03-14

问题是刷新/重新绘制问题,但实际上您从未更改JLabel的文本。更改数据。文本实际上不会更改JLabel的文本。您必须调用JLabel的setText方法。如果您在更改数据后立即尝试打印JLabel的文本。文本您会注意到JLabel的文本没有更改。以下是我的解决方案:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EtchedBorder;

public class Repaint_Test
{
    public static void main(String args[]){
        Frame frame = new Frame();
    }
}

class Frame extends JFrame
{
    private static final long serialVersionUID = 1L;
    public Frame()  {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(500,250);
        this.setLocationRelativeTo(null);
        this.setLayout(new GridLayout(1,2));
        Panel1 p1 = new Panel1();
        Panel2 p2 = new Panel2();
        Data.panel2 = p2; // getting the reference of panel2    
        this.add(p1);
        this.add(p2);
        this.setVisible(true);
    }
}

class Panel1 extends JPanel
{
    private static final long serialVersionUID = 1L;
    public Panel1(){
        this.setBorder(BorderFactory.createTitledBorder(new EtchedBorder(),"Panel1:"));
        JButton button = new JButton("Push");
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                Data.text = "text"; // changing commonly accessed data              
                Data.panel2.setBackground(Color.PINK); // this works
                //Data.panel2.invalidate();
                //Data.panel2.validate();
                //Data.panel2.updateUI();
                //Data.panel2.revalidate();
//                Data.panel2.repaint();                // this does not work
                Data.panel2.updateText(Data.text);
            }
        });
        this.add(button);
    }
}

class Panel2 extends JPanel
{
    private static final long serialVersionUID = 1L;
    private JLabel label;

    public Panel2(){
        this.setBorder(BorderFactory.createTitledBorder(new EtchedBorder(),"Panel2:"));

        label = new JLabel("Initial Text");
        add(label);
    }

    public void updateText(String text) {
        label.setText(text);
    }
}

class Data
{
    public static Panel2 panel2 = null;
    public static String text = "ooooo";
}
 类似资料:
  • 问题内容: 我有一个swing应用程序,在其中可以在JPanel中显示图像。如果应用程序无法生成图像,我想从JPanel中删除前一个图像,并用JTextField和消息替换它。我可以添加文本字段,但是它是在先前内容的顶部绘制的,该内容本身是JPanel的子类。这是我所拥有的: 如何获得cdPanel完全重绘自身? 问题答案: 您可以简单地尝试致电: 代替

  • 我在刷新gridlayout的值时遇到问题。 因此,我在JFrame中有一个JPanel,在这个JPanel中,一旦我输入了两个值(一个用于行,一个用于列),然后单击validate,我就得到了一个包含JButtons之前值的GridLayout。例如,如果我输入(2,2),我会得到一个包含4个按钮的GridLayout,每个按钮中都有一个图像。 所以我的问题是,每次我想通过改变值来刷新GridL

  • 我有一个JScrollPane,其中包含一个JPanel,该JPanel包含一组JPanels。 集合大小可以更改,这就是为什么我把它放在JScrollPane中的原因。 由于某种原因,无论我做什么,旋钮都不会出现在卷轴上。 正如您所看到的,主JPanel(预览)确实有一个布局。我读到如果布局为空,可能会发生这种情况。 有人知道怎么解决这个吗? null 这是我的代码:

  • 额外信息:我是用BlueJ来从中,用4个类在basic程序中回答我的问题。我意识到很多人在互联网上说要使用键绑定而不是KeyListener,但我现在不明白键绑定... ---遵循装满鳗鱼的气垫船的建议,我将尝试使用键绑定。--- 所以Keybindings有两个“命令”来工作:输入和操作。

  • 问题内容: 我正在尝试创建一些用于特定目的的特殊组件,在该组件上我需要绘制HTML字符串,这是示例代码: 不幸的是,drawString方法似乎无法识别HTML格式,它愚蠢地按原样绘制字符串。 有什么办法可以使这项工作吗? 问题答案: 我找到了一种简洁的模拟方法; 这是代码:

  • 我有一个名为BigPanel的JPanel子类作为JFrame的内容窗格,在BigPanel对象中有一个嵌套的JPanel子类。单击按钮,嵌套面板应该从一个JPanel子类更改为另一个。嵌套面板没有重置,正确的子类将打印到控制台,但实际面板不会更新包com.grantbroadwater;