JDialog重绘不起作用

时间:2016-02-11 06:06:29

标签: java swing

我有一个JDialog,当有触发器(比如按钮动作监听器)时,我想在其中更改组件(例如从TextField到JLabel)。我试过重绘并重新验证。但仍然没有工作。任何帮助都将受到高度赞赏。

以下是示例代码: JDialog有JButton和另一个JComponent(最初是JtextField)。当我点击按钮时,textfield必须更改为标签。

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);
  }
}

1 个答案:

答案 0 :(得分:3)

你在这里创建了一个新的JLabel,c = new JLabel("Hi");但你把它添加到任何东西,没有容器,没有。如果要在GUI中将其可视化,则必须将其添加到容器中,该容器是顶级窗口(如JFrame,句点)的容器层次结构的一部分。

您的问题深入探讨了对象和变量之间的区别。是的,你更改了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引用更改为"goodbye "时,您不会更改原始对象它引用的是原始字符串"hello ",并且更改的引用对s12字符串没有影响。同样,更改c的引用将不会影响您的GUI。

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