Java передача данных между классами

Передача данных между классами Java

У меня возникли проблемы с получением переменной из моего класса Color после отправки индекса из графического интерфейса после выбора цвета из выпадающего списка. Я могу отправить индекс штрафа и получить его из HashMap, я знаю это, потому что я использую System.out.println для проверки. В основном, мои вопросы, где я ошибся? и что мне нужно помнить, чтобы убедиться, что у меня нет этой проблемы снова? Изменение: забыл упомянуть, кнопка отправки индекса находится в отдельном JPanel, который используется для компонентов пользовательского интерфейса (кнопки и комбинированные поля).

//edit class UIPanel extends JPanel < public MainPanel gpanel; public Integer data; public Color colval; public Colour col; public UIPanel(MainPanel panel) < col = new Colour(); gpanel = panel; Box btnBox = Box.createHorizontalBox(); btnBox.add(setBtn = new JButton()); btnBox.add(Box.createHorizontalGlue()); JButton setBtn = new JButton("Set"); final DefaultComboBoxModel colour = new DefaultComboBoxModel(); colour.addElement("Red"); final JComboBox colours = new JComboBox(colour); JScrollPane colourScroll = new JScrollPane(colours); btnBox.setSize(300, 100); btnBox.add(Box.createHorizontalGlue()); add(btnBox, BorderLayout.NORTH); //end of edit Button to send Index from GUI class to Colour class setBtn.addActionListener(new ActionListener()< public void actionPerformed(ActionEvent e) < data= colours.getSelectedIndex(); col.setCol(data); >>); 
public class Colour < public Color colVal; HashMapmap = new HashMap(); public Colour() < map.put(0, Color.RED); map.put(1, Color.BLUE); map.put(2, Color.YELLOW); map.put(3, Color.GREEN); >public Color setCol(Integer data) < //Color colours; colVal = map.get(data); System.out.println("colour" + colVal); return colVal; >public Color getColVal()
class MainPanel extends JPanel < //private Colour col; int px, py; //radius public Color colvals; public Colour col; public MainPanel() < col = new Colour(); this.addMouseMotionListener(new MouseMotionAdapter() < // store drag coordinates and repaint public void mouseDragged( MouseEvent event ) < px = event.getX(); py = event.getY(); repaint(); >>); // end call to addMouseMotionListener > public void paint( Graphics g ) < g.setColor(col.colVal);//This is where the colour value will be placed System.out.println(col.colVal); g.fillOval( px, py, 15, 15 ); >> 

Вероятно, я пропустил что-то глупое, но, похоже, я не понимаю. PS: Насколько сложно будет сделать приложение Vignere Cipher Application?

3 ответа

public class Colour < public Color colVal; HashMapmap = new HashMap(); public Colour() < map.put(0, Color.RED); map.put(1, Color.BLUE); map.put(2, Color.YELLOW); map.put(3, Color.GREEN); >// **** change name **** public Color getCol(Integer data) < //Color colours; colVal = map.get(data); System.out.println("colour" + colVal); return colVal; >// **** not sure you need this method public Color getColVal()
 public void actionPerformed(ActionEvent e) < data = colours.getSelectedIndex(); Color color = col.getCol(data); // note name change // use Color variable, color, somehow here mainPanel.setColVals(color); // something like this perhaps mainPanel.repaint(); // to tell the JVM to repaint the JPanel >

Также обратите внимание, что в переопределении класса JPanel вы должны переопределить метод paintComponent , а не метод paint , и не забудьте вызвать метод super. т.е.

public void setColVals(Color colVals) < this.colVals = colVals; >@Override protected void paintComponent(Graphics g) < super.paintComponent(g); g.setColor(colVal); // System.out.println(colVal); g.fillOval( px, py, 15, 15 ); >
  • Избавьтесь от цвета полностью.
  • Используйте перечисление, чтобы совместить ваш цвет с строкой и создать модель JComboBox из этого перечисления.
  • Использование перечисления не позволит вам использовать магические числа с риском того, что неправильный номер был использован, число, которое не соответствует цвету.
  • Кроме того, с помощью перечисления, тривиально изменить свой код и добавить больше цветов. Просто добавьте новый элемент в перечисление, а остальная часть программы будет адаптироваться к изменению.
  • Добавьте PropertyChangeListener из MainPanel в UIPanel и прослушайте изменения в свойстве «привязанного» цвета.
  • Используйте RenderingHints с объективом Graphics2D, чтобы сгладить зубцы из чертежа круга.
import java.awt.*; import java.awt.event.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.*; public class ColorListenerPanel extends JPanel < public ColorListenerPanel() < UIPanel uiPanel = new UIPanel(); MainPanel mainPanel = new MainPanel(uiPanel); setLayout(new BorderLayout()); add(mainPanel, BorderLayout.CENTER); add(uiPanel, BorderLayout.PAGE_START); >private static void createAndShowGui() < ColorListenerPanel mainPanel = new ColorListenerPanel(); JFrame frame = new JFrame("ColorListenerPanel"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); >public static void main(String[] args) < SwingUtilities.invokeLater(new Runnable() < public void run() < createAndShowGui(); >>); > > class MainPanel extends JPanel < private static final int PREF_W = 800; private static final int PREF_H = 650; private static final int OVAL_WIDTH = 16; private int px, py; private Color color = MyColors.values()[0].getColor(); public MainPanel(UIPanel uiPanel) < this.addMouseMotionListener(new MouseMotionAdapter() < // store drag coordinates and repaint public void mouseDragged(MouseEvent event) < px = event.getX(); py = event.getY(); repaint(); >>); uiPanel.addPropertyChangeListener(UIPanel.COLOR, new UiListener()); > @Override protected void paintComponent(Graphics g) < super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setColor(color); g.fillOval(px - OVAL_WIDTH / 2, py - OVAL_WIDTH / 2, OVAL_WIDTH, OVAL_WIDTH); >@Override public Dimension getPreferredSize() < if (isPreferredSizeSet()) < return super.getPreferredSize(); >return new Dimension(PREF_W, PREF_H); > private class UiListener implements PropertyChangeListener < @Override public void propertyChange(PropertyChangeEvent pcEvt) < // not really needed since our listener is added using // this property name if (!UIPanel.COLOR.equals(pcEvt.getPropertyName())) < return; >color = (Color) pcEvt.getNewValue(); repaint(); > > > enum MyColors < RED("Red", Color.RED), BLUE("Blue", Color.BLUE), YELLOW("Yellow", Color.YELLOW), GREEN("Green", Color.GREEN); private String name; private Color color; private MyColors(String name, Color color) < this.name = name; this.color = color; >public String getName() < return name; >public Color getColor() < return color; >@Override public String toString() < return name; >> class UIPanel extends JPanel < public static final String COLOR = "color"; private MainPanel gpanel; private Integer data; private Color color; private DefaultComboBoxModelcomboModel = new DefaultComboBoxModel<>(); private JComboBox colorsCombo = new JComboBox<>(comboModel); SetColorAction setColorAction = new SetColorAction("Set", KeyEvent.VK_S); public UIPanel() < setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS)); add(colorsCombo); add(Box.createHorizontalStrut(5)); add(new JButton(setColorAction)); colorsCombo.addActionListener(setColorAction); add(Box.createHorizontalGlue()); for (MyColors myColor : MyColors.values()) < comboModel.addElement(myColor); >> public void setColor(Color color) < Color oldValue = this.color; Color newValue = color; this.color = color; firePropertyChange(COLOR, oldValue, newValue); >private class SetColorAction extends AbstractAction < public SetColorAction(String name, int mnemonic) < super(name); putValue(MNEMONIC_KEY, mnemonic); >@Override public void actionPerformed(ActionEvent evt) < MyColors selection = (MyColors) colorsCombo.getSelectedItem(); if (selection != null) < setColor(selection.getColor()); >> > > 

упс, только что понял, я забыл упомянуть, что кнопка находится в отдельной JPanel к главной панели, так как у меня были проблемы с отображением материала. Не знаю, будет ли это иметь какое-либо значение.

Читайте также:  Javascript remove all listener

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

Это работает сейчас, спасибо 🙂 Мне просто нужно помнить, что есть список действий, который бы также получал значение при нажатии.

JComboBox можно использовать для непосредственного использования любых объектов в качестве элементов с учетом только одной маленькой вещи: он будет использовать toString для отображаемой метки. (см. JComboBox javadoc — Предоставление пользовательского рендеринга).

Но вместо использования специального рендеринга я всегда предпочитал писать очень простой вспомогательный класс один раз — позвольте ему использовать ComboBoxItem который можно использовать повторно для любых данных.

public class ComboBoxItem  < private T value; private String label; public ComboBoxItem(T value, String label) < this.value = value; this.label = label; >public T getValue() < return this.value; >public String getLabel() < return this.label; >// important! since this is the workaround ;-) public String toString() < return this.label; // or whatever you like >> 

А затем заполнить JComboBox с помощью ComboBoxItem вместо значений String :

final DefaultComboBoxModel colour = new DefaultComboBoxModel(); colour.addElement("Red"); colour.addElement("Blue"); colour.addElement("Yellow"); colour.addElement("Green"); colours = new JComboBox(colourValues); 
final DefaultComboBoxModel colour = new DefaultComboBoxModel(); colour.addElement(new ComboBoxItem(Color.RED, "Red")); colour.addElement(new ComboBoxItem(Color.BLUE, "Blue")); colour.addElement(new ComboBoxItem(Color.YELLOW, "Yellow")); colour.addElement(new ComboBoxItem(Color.GREEN, "Green")); colours = new JComboBox(colourValues); 

Это заставит select содержать ComboBoxItem качестве значений, к которым вы можете просто получить доступ, выполнив следующие действия:

// instead of getSelectedIndex() ComboBoxItem item = (ComboBoxItem) colours.getSelectedItem(); Color c = item.getValue(); 

Такую же процедуру можно повторно использовать для любых других значений — даже сложных.

Примечание. Если у вас есть объект данных с соответствующим представлением toString(), вы можете, конечно, просто использовать его как значение для выбора.

Примечание2. Если представление строки недостаточно (например, вы хотите отобразить цвет вместе с именем), посмотрите на ListCellRenderer, который может отображать элемент любым желаемым способом (путем возврата произвольного JComponent).

Читайте также:  Xml в csv на java

Спасибо за ваш ответ, проблема была исправлена, но я планирую узнать из вашего ответа, поэтому, если у меня возникнут какие-либо проблемы, я могу оглянуться назад 🙂

@IgnisSnowman: если окончательный ответ помог, пожалуйста, проголосуйте (как я сделал), нажав на стрелку вверх рядом с ответом.

 public void paint( Graphics g ) < g.setColor(col.colVal);//This is where the colour value will be placed System.out.println(col.colVal); g.fillOval( px, py, 15, 15 ); >

Вы используете g.setColor(col.colVal); col.colVal предоставит вам значение по умолчанию, назначенное ему, вероятно, null, вы должны использовать col.getColVal(), поскольку это метод getter, который вы создали для атрибута colVal.

А также в объявлении сеттера public Color setCol(Integer data) тип возвращаемого вами типа — это цвет, но если вы используете эту функцию в своем GUI-классе без переменной Color, которая может принимать значение, возвращаемое вашим установщиком. Я не понимаю необходимость возврата значений из метода Setter.

Спасибо за ваш ответ, проблема была исправлена, но я планирую узнать из вашего ответа, поэтому, если у меня возникнут какие-либо проблемы, я могу оглянуться назад 🙂

Ещё вопросы

  • 1 Нужна помощь, создав диалог с 2 NumberPickers
  • 0 JS не работает на ПК, но работает на JSFIddle
  • 1 Группа захвата Regex не распознает группу (1), несмотря на совпадения () true
  • 0 ОШИБКА 1055 (42000): Выражение № 1 списка SELECT отсутствует в предложении GROUP BY . это несовместимо с sql_mode = only_full_group_by [duplicate]
  • 1 Python, построить три графика в plt.subplots (2,2)?
  • 1 Почему для запуска функции требуется первый двойной щелчок, а затем один щелчок?
  • 1 Не удается открыть новое действие по методу onResponse of Volley
  • 1 Насмешливые функции, полученные из метода __getattr__
  • 0 Набор символов Liquibase MySQL для изменения таблицы
  • 0 mysql: использование динамического поля в запросе на совпадение
  • 1 Строки в pandas.Series всегда меньше 0?
  • 0 MySQL — группировка по неагрегированному столбцу
  • 0 Как добавить нового пользователя в Kamailio, используя PHP shell_exec?
  • 0 Компиляция и использование OpenCV
  • 0 Класс отката после функции щелчка
  • 1 Больше информации об ошибке + более длинная программа или меньше информации об ошибке + более короткая программа?
  • 0 Как вставить новую строку в таблицу из дочернего контроллера в angularjs
  • 1 Knexjs PgSQL JSON запрос
  • 0 Как динамически сгенерировать mysql ON DUPLICATE UPDATE в python
  • 0 Ошибка проверки формы при использовании тега ion-scroll
  • 1 ожидается имя метода c # INotifypropertyChanged
  • 0 Как установить значение по умолчанию с InterfaceGL?
  • 0 Вызов href из JavaScript
  • 1 Как сделать новый сервлет с помощью мастера?
  • 0 Есть ли способ заставить браузер загрузить ссылку без попадания в кеш?
  • 1 некоторые настройки в VS Code
  • 1 Отображение элементов в ListViews внутри RecyclerView
  • 1 Не удалось разрешить: firebase-ads: 15.0.1: 15.0.0
  • 0 Методы цепочки с задержками в JavaScript
  • 0 Javascript рекурсия не охватывает все элементы
  • 0 Форма jQuery вылетает при щелчке переключателя
  • 0 Какой быстрый способ добавить новые строки кода в начало и конец всех моих файлов?
  • 0 Общий фильтр для двух разных маршрутов
  • 0 Почему объединение таблиц не работает в symfony2?
  • 1 Реагировать на родной плоский список, а не на ожидаемое поведение
  • 1 Как я могу скопировать триангуляцию Делоне в новые точки?
  • 0 Как сохранить выбор флажка с тем же именем и идентификатором
  • 0 joomla — принудительно получить ключевое слово из определенного языка в JText
  • 1 pyshark: доступ к сырым данным udp
  • 1 Python ctypes: структура с инициализацией битовых полей
  • 1 Испытайте JavaScript для детей. Глава 6. Какой правильный ответ
  • 0 Предупреждение: preg_match () [function.preg-match]: без конечного разделителя ‘^
  • 0 плагин проверки jQuery не проверяет мои формы
  • 0 выберите для обновления дважды к той же таблице ключом diffrenet, вызывающим взаимоблокировку в MySQL
  • 1 Подсчитать количество каждого символа в строке
  • 1 Pyspark — отдельные записи на основе 2 столбцов в датафрейме
  • 1 Панды: получить самые высокие значения во всем фрейме данных, а значения строки / столбца?
  • 0 Ошибки ограничения внешнего ключа
  • 1 Получить все div под div с известным идентификатором и перебрать его
  • 1 Контекстные переменные в Python
Читайте также:  Консоль в питоне закрывается

Источник

Как передать данные между классами в Java

Пробую писать программу на Java и столкнулся со следующей проблемой: у меня есть массив данных, который я генерирую в классе1, его нужно передать в класс2, изменить данные в нем и вернуть в класс1, чтобы при следующем обращении к нему данные уже были изменены. У меня выходит только передача в класс2, но измененный массив не могу передать обратно. Как это можно реализовать?

Ответы (3 шт):

  • Правильней всего будет сделать массив в классе 1 приватным полем и содать публичные методы для его изменения, которые будите вызывать в классе 2.
  • Так же можно создать в классе 1 публичный метод геттер, который будет возвращать этот массив, и вызывать этот метод в классе 2, а уже в классе 2 менять массив как вам надо.

У вас очень общий вопрос, поэтому приведу псевдокод, от которого вы сможете оттолкнуться и написать свой код, причём необязательно так же. Если я правильно вас понял, ваш массив не изменяется (не меняется его размер или тип содержимого, то есть его не надо создавать заново), а меняются лишь сами данные в нём.

public class ClassOne < private Data[] data; private ClassTwo processor; // инициализируйте сетером, конструктором ClassOne или прямо тут // какие-то другие поля и методы этого класса public void work() < if (data == null) < this.data = generateData(); >// какой-то другой необязательный код > private Data[] generateData() < Data[] data = . // дальше код генерации начальных данных processor.processData(data); return data >> public class ClassTwo < // какие-то поля и методы этого класса public void processData(Data[] data) < // код обработки данных >> 

Затем просто вызывайте метод work() .

Думаю, прежде всего стоит понять, что ты работаешь не с классами, а с их экземплярами. И ты не переходишь между классами. а можешь из объекта одного класса вызвать метод объекта другого.

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

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

Источник

Оцените статью