2013-10-05 2 views
0

Я новичок в Java, поэтому, пожалуйста, несите меня, если это самая глупая вещь, которую вы когда-либо слышали.Получение методов из другого класса в Java

Итак, в основном я создаю форму на Java. Когда он отправлен, он проверяется, и если есть ошибка, я хочу, чтобы конкретный элемент формы стал красным. Я сумел сделать это с помощью вызова метода setAsError()

public void setAsError(){ 
    this.setBackground(new Color(230,180,180)); 
} 

Но проблема в том, что моя форма элементов (Включает в себя текстовые поля, выпадающие списки и другие классы свинг) уже расширяет компоненты Java.

public class KComboBox extends JComboBox { 

public KComboBox(String[] s){ 
    super(s); 
    //There's other stuff in here too 
} 

Я хочу добавить метод setAsError() в свои элементы формы. Я понимаю, что я мог бы индивидуально добавить метод ко всем необходимым классам, но это кажется немного странным для программирования OO.

В любом случае, конечный результат должен быть, когда я

myFormItem.setAsError() 

поле должно покраснеть.

Любая помощь будет оценена, и спасибо заранее.

ответ

1
public void setAsError(JComponent component){ 
    if(component instanceof JTextField){ 
    JTextField field = (JTextField) component; 
    field.setBackground(Color.RED); 
    }else if(component instance of JTextArea){ 
    JTextArea area = (JTextArea) component; 
    area.setBackground(Color.RED); 
    } 
} 

Просто добавить JComponent аргумент к вашему setError(), вы можете добиться того, что вы хотите.

Теперь скажите, что вы обнаружили, что пользователь оставил поле «имя» в форме пустым. Когда он нажимает кнопку отправки, я уверен, что вы проверяете пустое состояние.

if(nameField.getText().equals("")){ 
    this.setAsError(nameField); 
} 

Теперь, я уверен, что вам нужно сбросить цвет фона, что это было, как только вы узнали, что ошибка ушла из этой области, поэтому я предлагаю вам также сделать resetError(JComponent compo) где сброс цвета по умолчанию.
Теперь цвет фона может отличаться от Windows до Mac до Ubuntu. Что вам нужно сделать, так это получить цвет фона в начале приложения и сохранить его.
Когда условие ошибки исчезло, установите его в значение по умолчанию, которое вы сохранили.

+1

Попытайтесь избежать 'instanceof' –

+0

@MaximShoustin, тогда OP придется прибегать к' getClass(). GetName() ':) –

+0

Это кажется интересным, никогда не видел ответа, подобного этому при поиске. Быстрый вопрос, хотя в этом решении, в какой класс будет идти метод setAsError()? Я хотел бы сделать это таким образом, чтобы дубликатов не было. –

4

Java поддерживает наследование нескольких интерфейсов, что позволяет объекту наследовать многие сигнатуры методов из разных интерфейсов.

Так что создайте новый interface с помощью метода setAsError добавьте инструмент для всех соответствующих классов.

Что-то вроде:

public interface ErrorItf { 
public void setAsError(); 
} 

После, добавьте его в свой класс:

public class KComboBox extends JComboBox implements ErrorItf{ 

... 

    @override 
    public void setAsError(){ 
    this.setBackground(new Color(230,180,180)); 
    } 

} 

Теперь вместо того, чтобы вызвать ваш класс, называют интерфейсом, например:

ErrorItf element = getComboBox(); 
element.setAsError(); 

When вы отправляете сообщение объекту (aka element.setAsError()), хотя вы не знаете, какой именно тип JComboBox или JTextarea .... Это называется полиморфизм

В качестве примечания, пример того, как интерфейс может помочь в вашем случае

enter image description here

+0

Спасибо за помощь. Однако, если я это сделаю с помощью интерфейсов, мне не придется индивидуально писать метод во всех классах, которые он реализует? Мне было интересно, есть ли способ избежать этого. –

+0

@KaneelDias Посмотрите на мой ответ о том, как это сделать без интерфейсов :-) –

+1

Являются ли ваши классы одинаковыми методами реализации? –

0

Лучше здесь, чтобы создать интерфейс. Просто напишите

Interface SetAsErrorable{ 
    void setAsError(); 
} 

В глобальном масштабе (или в его собственном файле). Затем добавьте во все свои классы элементов формы implements SetAsErrorable. IE KComboBox extendsJComboBox implements SetAsErrorable{.

0

Похоже, используя интерфейс будет хорошо ...

public interface errorInterface { 
public setAsError(); 
} 

public class KComboBox extends JComboBox implements errorInterface { 

@Override 
setAsError() { 
    this.setBackground(new Color(230,180,180)); 
} 
} 
Смежные вопросы