我有一个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);
}
}
答案 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 概念:这有意义吗?