2013-05-23 4 views
0

Мне нужно изменить текст внутри Jкомпонентов, расположенных в координатах x и y на JPanel. Но если я меняю текст везде, за исключением TextFields или PasswordFields, расположение и размеры элементов скольжения.Изменение текста на JComponent

Слушатель, который изменяет параметры элементов

private TextListener textListener = new TextListener() { 

    @Override 
    public void textValueChanged(TextEvent e) { 
     if (comp.getClass() == JButton.class) { 
      ((JButton)comp).setText(ttext.getText()); 
     }else{ 
      if(comp.getClass() == JTextField.class){ 
       ((JTextField)comp).setText(ttext.getText()); 
      }else{ 
       if(comp.getClass() == JPasswordField.class){ 
        ((JPasswordField)comp).setText(ttext.getText()); 
       }else{ 
        if(comp.getClass() == JTextArea.class){ 
         ((JTextArea)comp).setText(ttext.getText()); 
        }else{ 
          if(comp.getClass() == JCheckBox.class){ 
           ((JCheckBox)comp).setText(ttext.getText()); 
          }else{ 
           ((JRadioButton)comp).setText(ttext.getText()); 
          } 
         } 
        } 
       } 
      } 
     try{ 
      comp.setBounds(tx,ty,Integer.valueOf(twidth.getText()),Integer.valueOf(theight.getText())); 
     }catch(NumberFormatException ex){ 
      JOptionPane.showMessageDialog(null,"Error","Error",JOptionPane.ERROR_MESSAGE); 
     } 
     comp.repaint();   
    } 
}; 

Что я могу сделать? Благодаря!

+0

Я использую BorderLayout в общей раме, но в панели, в которой я поставил JComponents нет макетов. – user2414779

+0

', но в Panel, в котором я поставил JComponents, нет макетов' - ну, вы должны использовать LayoutManger. Задача менеджера компоновки - определить размер компонента. Тогда вам не нужно беспокоиться о любом слушателе. Вы не должны использовать setBounds(). Также вы не должны использовать TextListener, только для компонентов AWT. – camickr

+0

Вы когда-нибудь слышали о 'instanceof'? Вместо записи 'if (comp.getClass() == JButton.class)' write вместо 'if (comp instanceof JButton)'.Даже сделайте еще один шаг, используйте 'AbstractButton', который является предком как JButton, так и JCheckBox' и использует' JTextComponent', который является предком 'JTextField',' JPasswordField' и 'JTextArea' (и другие). Вы можете получить свой большой 'if else' до 4 строк. –

ответ

0

Я думаю, что проблема заключается в макете, которую вы используете, но трудно получить хороший ответ, когда эта информация не указана.

1
  • для лучшей помощи раньше опубликовать SSCCE, короткие, работоспособной, компилируется

, которые расположены в точке с координатами х и у на JPanel


  • Component[] components = myPanel.getComponents();

  • затем цикл внутри components массивов

    if (components[i] instanceof JLabel) {   
         JLabel myLabel = (JLabel) components[i]; 
         myLabel.whatever 
        } else if (components[i] instanceof JButton) { 
         JButton myButton = (JButton) components[i]; 
         myButton.whatever 
        } and so on...., 
    
  • это/эти временные переменный (ы) в этой форме действует только внутри цикла, но снабжение реальных JComponents , и они действительно изменены

  • вы можете потеряться в JFrame и некоторых Compound JComponent s не возвращает реальный JComponents (JPanel, JButton, JTextField), возвращает Objects реализованы в BasicXxxUI, но может быть заменена JComponents, или можно использовать методы, реализованные для JComponents, например редактируемых JComboBox может возобновить JTextField или JFormattedTextField в качестве компонента редакторов


  • не хорошая идея охоты JComponents помещается в JPanel, вы должны знать, во всех случаях, что, как, где, сколько ....
Смежные вопросы