2016-02-11 3 views
-1

У меня есть JDialog, в котором я хотел изменить компоненты (например, от TextField до JLabel), когда есть триггер (например, прослушиватель действий кнопки). Я попробовал перерисовать и повторить проверку. Но все равно не работает. Любая помощь будет высоко оценен.JDialog repaint не работает

Вот пример кода: JDialog имеет JButton и еще один JComponent (изначально 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); 
    } 
} 
+0

'revalidate' и' repaint' вместо – MadProgrammer

+0

Я сделал ревизию и перерисовку на панель и диалог. но ничего не получилось – MMPgm

+0

Конечно, это не сработает, так как вы снова не добавляете JLabel в графический интерфейс. –

ответ

3

Вы создаете новый JLabel здесь, c = new JLabel("Hi"); но вы добавляете его в ничто, не контейнер, ничего. Если вы хотите визуализировать его в графическом интерфейсе, вы должны добавить его в контейнер, который является частью иерархии контейнера окна верхнего уровня, такого как период JFrame.

Ваш вопрос сводится к тому, что является разницей между объектом и переменной. Да, вы меняете объект, на который ссылается переменная, но понимаете, что это будет без эффекта по предыдущей ссылке, которую он удерживал, JTextField, и что этот объект по-прежнему счастлив в графическом интерфейсе и останется неизменным даже после изменение c.

Myself, я хотел бы использовать 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 не повлияет на ваш графический интерфейс.

Опять же, это ключ концепция: Имеет ли это смысл?

+0

Здесь вы просто показываете Здравствуй. и кнопка исчезает. Я просто хотел узнать, как мы обновляем jdialog? – MMPgm

+1

@MMPgm: это не имеет ничего общего с «обновлением JDialog», и все это связано с тем, что вы смешиваете переменную с объектом. Изменение ссылки переменной c не повлияет на JDialog, поскольку это не переменная, которая добавляется в GUI, а скорее JTextField, на который он ссылался первоначально. Когда вы меняете ссылку, вы не вносите изменения в графический интерфейс JDialog. Вы не понимаете, как ООП работает с Java, основное недоразумение, которое вы должны очистить, если вы хотите двигаться вперед. –

+0

@MMPgm: см. Редактирование на мой ответ. Опять же, это имеет смысл для вас?Если нет, вам нужно будет продолжать работать над этим, чтобы сгладить это в своем сознании, поскольку снова это фундаментальная концепция Java. –

Смежные вопросы