Java JDialog重新绘制不起作用
我有一个JDialog,当有一个类似触发器的按钮动作监听器时,我想在其中更改组件,比如从TextField到JLabel。我试着重新油漆并重新验证。但仍然不起作用。任何帮助都将不胜感激 下面是一个示例代码: JDialog有JButton和另一个jComponentialy JtextField。当我点击按钮时,文本字段必须更改为标签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
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概念。