Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDialog重新绘制不起作用_Java_Swing - Fatal编程技术网

Java JDialog重新绘制不起作用

Java JDialog重新绘制不起作用,java,swing,Java,Swing,我有一个JDialog,当有一个类似触发器的按钮动作监听器时,我想在其中更改组件,比如从TextField到JLabel。我试着重新油漆并重新验证。但仍然不起作用。任何帮助都将不胜感激 下面是一个示例代码: JDialog有JButton和另一个jComponentialy JtextField。当我点击按钮时,文本字段必须更改为标签 package sample; import java.awt.Dimension; import java.awt.event.ActionEvent; im

我有一个JDialog,当有一个类似触发器的按钮动作监听器时,我想在其中更改组件,比如从TextField到JLabel。我试着重新油漆并重新验证。但仍然不起作用。任何帮助都将不胜感激

下面是一个示例代码: JDialog有JButton和另一个jComponentialy JtextField。当我点击按钮时,文本字段必须更改为标签

package sample;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * @author mravindran
 *
 */

public class JDialogRefresh extends JDialog {
  JComponent c;
  JPanel p;

  JDialogRefresh() {
    p = new JPanel();
    JButton b = new JButton();

    c = new JTextField();
    b.addActionListener(new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent e) {
        c = new JLabel("Hi");
        p.revalidate();
        p.repaint();
        getContentPane().validate();
        getContentPane().repaint();
       /* validate();
        repaint();*/

      }
    });
    c.setPreferredSize(new Dimension(50,20));
    p.add(b);
    p.add(c);
    this.add(p);

  }

  public static void main(String[] args) {
    JDialogRefresh dialog = new JDialogRefresh();
    dialog.pack();
    dialog.setVisible(true);
  }
}
答案如下:

package sample;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * @author mravindran
 *
 */

public class JDialogRefresh extends JDialog {
  JComponent c;
  JPanel p;

  JDialogRefresh() {
    p = new JPanel();
    JButton b = new JButton();

    c = new JTextField();
    b.addActionListener(new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent e) {
        p.remove(c);
        c = new JLabel("Hi");
        p.add(c);
        p.revalidate();
        p.repaint();
        getContentPane().validate();
        getContentPane().repaint();
       /* validate();
        repaint();*/

      }
    });
    c.setPreferredSize(new Dimension(50,20));
    p.add(b);
    p.add(c);
    this.add(p);

  }

  public static void main(String[] args) {
    JDialogRefresh dialog = new JDialogRefresh();
    dialog.pack();
    dialog.setVisible(true);
  }
}

在这里创建一个新的JLabel,c=newjlabelhi;但你什么都不加,没有容器,什么都不加。如果要在GUI中可视化它,必须将其添加到作为顶级窗口(如JFrame、period)容器层次结构一部分的容器中

您的问题深入到对象和变量之间的区别。是的,您可以更改c变量所引用的对象,但是要理解,这不会影响它所持有的上一个引用JTextField,并且该对象仍然在GUI中,即使更改了c的引用,也不会改变

我自己会使用CardLayout交换视图:

import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class JDialogRefresh extends JDialog {
    private static final String HI = "Hi";
    private CardLayout cardLayout = new CardLayout();
    private JPanel mainPanel = new JPanel(cardLayout);
    private JComponent c;
    private JPanel p;

    JDialogRefresh(JFrame frame) {
        super(frame, "Foo", ModalityType.MODELESS);
        p = new JPanel();
        JButton b = new JButton("Button");

        c = new JTextField(10);
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                cardLayout.show(mainPanel, HI);
            }
        });
        p.add(b);
        p.add(c);

        mainPanel.add(p, "P");
        mainPanel.add(new JLabel("Hi", SwingConstants.CENTER), HI);
        this.add(mainPanel);
        pack();
        setVisible(true);

    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setVisible(true);
        JDialogRefresh dialog = new JDialogRefresh(frame);
        dialog.pack();
        dialog.setVisible(true);
    }
}
以下是解决您问题的关键问题:

String s1 = "hello ";
String s2 = "world";
String s12 = s1 + s2;

s1 = "goodbye ";
System.out.println(s12);
如果您对此进行测试,您将看到程序打印hello world,这是它应该打印的,因为当您将s1引用更改为再见时,您不会更改它引用的原始对象、原始字符串hello,并且更改的引用对s12字符串没有影响。同样,更改c的引用也不会对GUI产生影响


同样,这是一个关键概念:这有意义吗?

重新验证并重新喷漆,而不是将标题重新验证并重新喷漆到面板和对话框。但是什么都不起作用,当然也不会起作用,因为你再也没有将JLabel添加到GUI中。那么,你是否将分配了c的JLabel的新实例添加到对话框中了?明白了!仅仅改变参考是行不通的。我们必须删除该组件并再次添加它,以反映在GUI上。按钮消失了。我只是想知道如何刷新jdialog?@MMPgm:这与刷新jdialog无关,而与将变量与对象混淆有关。更改c变量的引用对JDialog没有影响,因为它不是添加到GUI的变量,而是它最初引用的JTextField。交换引用时,不会对JDialog GUI进行任何更改。您误解了OOP如何与Java一起工作,这是一个基本的误解,如果要继续前进,您必须澄清。@MMPgm:请参阅编辑我的答案。再说一遍,这对你有意义吗?如果没有,您将需要继续进行这方面的工作,以在您的头脑中解决这一问题,因为这也是一个基本的Java概念。