2012-06-17 3 views
4

импорт javax.swing. *;ActionListener между двумя классами

класс Ярлыки расширяет JFrame { JPanel pnl = new JPanel();

ImageIcon duke = new ImageIcon("duke.png"); 

JLabel lbl1 = new JLabel(duke); 
JLabel lbl2 = new JLabel("Duke is the friendly mascot of Java technology."); 
JLabel lbl3 = new JLabel ("Duke", duke, JLabel.CENTER); 

public Labels(){ 

    super("Swing Labels"); 
    setSize(1000 , 800); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    add(pnl); 
    setVisible(true); 

    lbl1.setToolTipText("Duke - the Java Mascot"); 

    lbl3.setHorizontalTextPosition(JLabel.CENTER); 
    lbl3.setVerticalTextPosition(JLabel.BOTTOM); 

    pnl.add(lbl1); 
    pnl.add(lbl2); 
    pnl.add(lbl3); 

} 
    public static void main(String [] args){ 
     Labels gui = new Labels(); 
    } 

}

Что делать, если я хочу использовать это в качестве JApplet? что нужно сделать? Трудно изменить?

Вещи, которые работают на JFrame, такие же, как на JApplet?

+0

Чтобы разъяснить, что ControlsB должен реализовать прослушиватель действий в отдельном классе, а класс actionlistener должен запрашивать у пользователя значения и передавать или инициировать класс Graph с этими значениями? –

+0

Мне нужно, чтобы xaxis1, xaxis2, yaxis3, yaxis4 в ControlsB.java, которые были введены, но пользователь (как вы можете видеть на загруженной диаграмме) связаны с переменными f, g, yaxis3, yaxis4, найденными на графике. java от ActionListener, который должен быть в другом классе. – Matthew

+1

Просто отправьте объект вашего класса «Graph» классу, который обрабатывает «События», и пусть этот класс вызывает метод 'setValues ​​()' вашего класса «Graph», каждый раз, когда вы изменяете значение, последний оператор этот метод 'setValues ​​()' будет 'repaint()', поэтому при каждом изменении значения он перекрасит 'JPanel' :-) –

ответ

3

Как я рекомендовал в one of your previous questions, вы должны реорганизовать свою программу в соответствии с Model-View-Controller рисунком, или один из его вариантов, так как это позволит вам аккуратно отделить код управления (который вызывается в ActionListener) из графический интерфейс. Для примера программы M-V-C, пожалуйста, ознакомьтесь со своими предложениями и кодом в this recent answer.

+0

org.jdesktop.swing.animation.demos/SplineEditor имеет отличный пример, ранее +1, задерживается, потому что я не могу запомнить впечатления от фигуры OP, EDIT aaaacch добро пожаловать, чтобы> 50k пользователей – mKorbel

+1

Поздравляем с достижением большой ориентиры :-) –

+0

@Hovercraft Я новичок в java, и, к сожалению, ссылки, которые вы мне дали, меня смущают: в любом случае спасибо за ваш вклад. – Matthew

3

Ну ладно первая проверка это: action listener in another class - java

Теперь все, что вам нужно сделать, это изменить его для своих нужд, а в actionPerformed(ActionEvent ae) вы затем получить значение в классе controlB.java путем доступа к данным с использованием метод accessor/get или заставить класс Actionlistener расширить ControlB, чтобы он имел доступ ко всем своим общедоступным данным, а затем, как только у вас есть значения, передайте их в Graph.java либо во время инициализации, либо с использованием метода mutator/set?

3

Некоторые классы, предпочтительно внутренний класс B, если вы хотите разрешить ввод только с JPanel B, должны реализовать ActionListener. Это ActionListener должен быть добавлен в JTextField:

myInputTextField.addActionListener(theActionListenerIAmGoingToWrite). 

Это ActionListener должен определить actionPerformed() что-то вроде этого:

String text = inputTextField.getText(); 
Integer inputInteger = Integer.getInteger(text).toInt(); 
graph.doStuffWithIntegerInput(inputInteger); 

Конструктивные вопросы, требующие ответа являются:

ли ActionListener анонимный внутренний класс? Если вы собираетесь использовать его только с конкретными экземплярами графа и B, которые знают друг о друге, тогда идите этим путем. Если это так, он должен получить ссылку на экземпляр Graph из его содержащего класса, что подразумевает, что B имеет такой экземпляр, чтобы предложить его.

Является ли действие ActionListener многоразовым в другом месте? Будет ли виджет «вводить числа» появляться в другом месте на других JPanels? Если это делает его самостоятельным классом. Вам по-прежнему нужна ссылка на график, чтобы либо график был как параметр constrcutor, либо/или иметь метод setGraph, потому что каким-то образом он должен знать о экземпляре графа, чтобы он мог отправить ему сообщение.

сделано!

редактировать 2

ОК так давайте карту, что вы должны в рамках MVC. Таким образом, ваше представление состоит из класса Graph и вашего класса B и ваших текстовых полей.

Теперь, содержащийся в вашем классе графа, у вас также есть данные, которые вы хотите отобразить. Это начальные, конечные, x, y переменные, которые вы определили. Чтобы быть хорошим гражданином MVC-земли, вам придется вытащить их и содержать в отдельном объекте b/c, они составляют модель вашего графика.Модель - это, по сути, набор фактов, которые вы хотите представить, независимо от того, как они будут представлены, а вид - это весь код, связанный с рисованием на экране.

Таким образом, этот объект модели будет простым объектом данных с геттерами и сеттерами для всех переменных, которые вы определили, и будет передан в объект Graph либо в конструкторе, либо через сеттер объекта Graph.

Создав этот объект GraphData, вы отделили представление, Graph от его модели - объект GraphData.

С помощью более сложного графика вы фактически указываете в GraphModel, какой «вид» объекта Graph вы хотите создать, какие будут имена оси, какую линию вы хотите нарисовать, например, но это слишком много для того, что у вас есть.

OK Итак, теперь у вас есть объекты Graph и GraphData и каким-то образом их собрать.

Далее посмотрим на ваш класс B. Поскольку это JPanel, представление, это, по существу, агрегатор и ведущий его содержащихся представлений. Это будут Graph и JTextFields. Поэтому вы добавляете их так, как вы, указав макет.

Так гипотетический рефакторинга выглядит следующим образом:

Создать главную программу. В этом основном создайте: JTextFields, ActionListener, JPanel (B), Graph и GraphModel.

Связанный GraphModel с графиком.

Связанный график с JPanel.

Associate ActionListener с JJtextField

Associate JTextField с JPanel

Насколько письма ActionListener идет просто сделать свой собственный класс, который легче всего писать и понимать. Таким образом:

public class MyTextFieldListener implements ActionListener 
{ 
    private Graph graph; 
    public MyTextFieldListener(Graph graph) 
    { 
     this.graph = graph; 
    }// construtor 

    public void actionPerformed (ActionEvent ae) 
    { 
     String text = ((JTextField)ae.getSource()).getText(); 
     Integer inputInteger = Integer.getInteger().(text).toInt(); 
     graph.doStuffWithIntegerInput(inputInteger); 
    } // actionPerformed 
}// class 

Теперь осложнением может быть, что вы не можете обновить график до тех пор, пока есть информация от всех четырех TextFields. Существуют различные способы изменить этот код, чтобы приспособиться к этому, но это основная идея того, куда вам нужно идти.

HTH

+0

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

+0

Я пересмотрел свой вопрос, может кто-нибудь посоветует спасибо – Matthew

1

OK. Давайте поговорим о вашем объекте RangeXY. В чем его цель? Я спрашиваю, потому что, кажется, ничего не нужно от JTextFields, то есть от пользовательского ввода.

Где вы вызываете graph.doStuffWithIntegerInput(), на самом деле, вы не используете целочисленный ввод от пользователя, что и происходит из текстового поля. Вы используете (и это просто неправильно), и вы вошли в конструктор RangeXY. Тогда вы (и здесь приходит «просто неправильная» часть), давая этому int статическому методу Integer getInteger(). Собственно, это не скомпилируется, поскольку getInteger берет строку и превращает ее в Integer.

OK так что давайте просто сделаем это. Делайте одно за раз. Сначала напишите класс, который подходит для этого описания:

Он реализует ActionListener; Он имеет переменную-член для Graph; Эта переменная-член для Graph устанавливается либо в сеттер, либо передается конструктору. У этого есть ПУСТОЙ actionPerformed метод (на данный момент)

Просто сделайте это, и мы возьмем его оттуда.

+0

Я тот парень, который отвечал на ваш вопрос выше ... Я потерял свой пароль и получил доступ к этому другому письму, поэтому мне пришлось начать с новой учетной записи. .. идут все мои кредиты или очки или что-то еще !!! LOL – user1462475

+0

Все эти виртуальные пиво спускаются .. ;-) Серьезно, хотя я не участвую в теме :), но *, который * «парень, который отвечал на ваш вопрос», это вы - Джон или Дэвид? – Leigh

+0

@ user1462475, если я удалю файл RangeXY, а вместо этого класс controlsB создаю: «class ControlsB extends JPanel реализует ActionListener» будет ли это работать? Теперь, если это возможно, мне нужно, чтобы программа была таким образом, что когда пользователь вводит значения диапазона x и y, и он нажимает кнопку изменения размера, значения передаются в файл Graph.java, и график перерисовывается с помощью новые переменные. Спасибо :) – Matthew

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